Apple push Notification Feedback service Not working

Posted by Yassmeen on Stack Overflow See other posts from Stack Overflow or by Yassmeen
Published on 2011-01-09T09:47:42Z Indexed on 2011/01/09 9:53 UTC
Read the original article Hit count: 428

Hi,

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..

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?

Note: I have another push notification applications on the device so I know that my app is not the only app.

The code - C#:

    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& 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 > 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 && Timestamp > 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;
    }

© Stack Overflow or respective owner

Related posts about c#-3.0

Related posts about apple-push-notifications