C# iPhone push server?

18,940

Solution 1

Figured it out. Replaced sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com"); with sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); And registered the certificates on the PC.

Edit: Here is the code for creating a payload as requested:

    private static byte[] GeneratePayload(byte [] deviceToken, string message, string sound)
    {
        MemoryStream memoryStream = new MemoryStream();

        // Command
        memoryStream.WriteByte(0);

        byte[] tokenLength = BitConverter.GetBytes((Int16)32);
        Array.Reverse(tokenLength);
        // device token length
        memoryStream.Write(tokenLength, 0, 2);

        // Token
        memoryStream.Write(deviceToken, 0, 32);

        // String length
        string apnMessage = string.Format ( "{{\"aps\":{{\"alert\":{{\"body\":\"{0}\",\"action-loc-key\":null}},\"sound\":\"{1}\"}}}}",
            message,
            sound);

        byte [] apnMessageLength = BitConverter.GetBytes((Int16)apnMessage.Length);
        Array.Reverse ( apnMessageLength );
        // message length
        memoryStream.Write(apnMessageLength, 0, 2);

        // Write the message
        memoryStream.Write(System.Text.ASCIIEncoding.ASCII.GetBytes(apnMessage), 0, apnMessage.Length);

        return memoryStream.ToArray();
    } // End of GeneratePayload

Solution 2

From Zenox's comment: use a different version of AuthenticateAsClient

sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false);

Solution 3

Other way is just to use X509Certificate2 and X509CertificateCollection2 classes.

Solution 4

I recently used Growl For Windows to push messages to the Prowl client on the IPhone from .Net code. So you might get your functionatlity without writing a push server yourself.

Share:
18,940
Kyle
Author by

Kyle

Self employed developer of SQLPro Studio for macOS, iOS and Windows.

Updated on July 31, 2022

Comments

  • Kyle
    Kyle almost 2 years

    Im attempting to write a push server for the iPhone in C#. I have the following code:

            // Create a TCP/IP client socket.
            using (TcpClient client = new TcpClient())
            {
                client.Connect("gateway.sandbox.push.apple.com", 2195);
                using (NetworkStream networkStream = client.GetStream())
                {
                    Console.WriteLine("Client connected.");
    
                    X509Certificate clientCertificate = new X509Certificate(@"certfile.p12", passwordHere);
                    X509CertificateCollection clientCertificateCollection = new X509CertificateCollection(new X509Certificate[1] { clientCertificate });
    
                    // Create an SSL stream that will close the client's stream.
                    SslStream sslStream = new SslStream(
                        client.GetStream(),
                        false,
                        new RemoteCertificateValidationCallback(ValidateServerCertificate),
                        null
                        );
    
                    try
                    {
                        sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com");
                    }
                    catch (AuthenticationException e)
                    {
                        Console.WriteLine("Exception: {0}", e.Message);
                        if (e.InnerException != null)
                        {
                            Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
                        }
                        Console.WriteLine("Authentication failed - closing the connection.");
                        client.Close();
                        return;
                    }
                }
    

    ect....

    Only I keep receiving a exception: "A call to SSPI failed, see Inner exception" Inner Exception -> "The message received was unexpected or badly formatted."

    Does anyone have any idea whats going wrong here?

  • Kyle
    Kyle almost 15 years
    That may work for pushing data to the apn, but what about handling the feedback though?
  • Akash Kava
    Akash Kava about 14 years
    What folder (Certificate Store) should I use to import to on Windows Server? Is it Personal or Trusted Publisher? I tried "Default select based on certificate type" but didnt work.