title: Apple push Notification Feedback service Not working
body: <p>I am developing an iPhone App that uses Apple Push Notifications. On the iPhone side everything is fine, on the server side I have a problem. Notifications are sent correctly however when I try to query the feedback service to obtain a list of devices from which the App has been uninstalled, I always get zero results. I know that I should obtain one result as the App has been uninstalled from one of my test devices. After 24 hours and more I still have no results from the feedback service..</p>
  
  <p>Any ideas? Does anybody know how long it takes for the feedback service to recognize that my App has been uninstalled from my test device? </p>
  
  <p><strong>Note: I have another push notification applications on the device so I know that my app is not the only app.</strong></p>
  
  <p>The code - C#:</p>
  
  <pre><code>    public static string CheckFeedbackService(string certaName, string hostName)
      {
          SYLogger.Log("Check Feedback Service Started");
          ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
           // Create a TCP socket connection to the Apple server on port 2196
          TcpClient tcpClientF = null;
          SslStream sslStreamF = null;
          string result = string.Empty;
           //Contect to APNS&amp; Add the Apple cert to our collection
          X509Certificate2Collection certs = new X509Certificate2Collection { GetServerCert(certaName) };
          //Set up
          byte[] buffer = new byte[38];
          int recd = 0;
          DateTime minTimestamp = DateTime.Now.AddYears(-1);
          // Create a TCP socket connection to the Apple server on port 2196
          try
          {
              using (tcpClientF = new TcpClient(hostName, 2196))
              {
                  SYLogger.Log("Client Connected  ::" + tcpClientF.Connected);
                  // Create a new SSL stream over the connection
                  sslStreamF = new SslStream(tcpClientF.GetStream(), true,ValidateServerCertificate);
                  // Authenticate using the Apple cert
                  sslStreamF.AuthenticateAsClient(hostName, certs, SslProtocols.Default, false);
                  SYLogger.Log("Stream Readable ::" + sslStreamF.CanRead);
                  SYLogger.Log("Host Name ::"+hostName);
                  SYLogger.Log("Cert Name ::" + certs[0].FriendlyName);
  
                  if (sslStreamF != null)
                  {
                      SYLogger.Log("Connection Started");
  
                              //Get the first feedback
                              recd = sslStreamF.Read(buffer, 0, buffer.Length);
                              SYLogger.Log("Buffer length ::" + recd);
                              //Continue while we have results and are not disposing
                              while (recd &gt; 0)
                              {
  
                                          SYLogger.Log("Reading Started");
                                              //Get our seconds since 1970 ?
                                              byte[] bSeconds = new byte[4];
                                              byte[] bDeviceToken = new byte[32];
                                              Array.Copy(buffer, 0, bSeconds, 0, 4);
                                              //Check endianness
                                              if (BitConverter.IsLittleEndian)
                                                      Array.Reverse(bSeconds);
                                              int tSeconds = BitConverter.ToInt32(bSeconds, 0);
                                              //Add seconds since 1970 to that date, in UTC and then get it locally
                                              var Timestamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(tSeconds).ToLocalTime();
                                              //Now copy out the device token
                                              Array.Copy(buffer, 6, bDeviceToken, 0, 32);
                                              string deviceToken = BitConverter.ToString(bDeviceToken).Replace("-", "").ToLower().Trim();
                                              //Make sure we have a good feedback tuple
                                              if (deviceToken.Length == 64 &amp;&amp; Timestamp &gt; minTimestamp)
                                              {
                                                  SYLogger.Log("Feedback " + deviceToken);
                                                  result = deviceToken;
                                              }
                                              //Clear  array to reuse it
                                              Array.Clear(buffer, 0, buffer.Length);
                                             //Read the next feedback
                                             recd = sslStreamF.Read(buffer, 0, buffer.Length);
                              }
                  SYLogger.Log("Reading Ended");
                  }
  
              }
  
          }
          catch (Exception e)
          {
              SYLogger.Log("Authentication failed - closing the connection::" + e);
              return "NOAUTH";
          }
          finally
          {
              // The client stream will be closed with the sslStream
              // because we specified this behavior when creating the sslStream.
              if (sslStreamF != null) sslStreamF.Close();
              if (tcpClientF != null) tcpClientF.Close();
              //Clear array on error
              Array.Clear(buffer, 0, buffer.Length);
          }
          SYLogger.Log("Feedback ended ");
          return result;
      }
  </code></pre>