Вопрос по c#, iphone – C # iPhone push-сервер?

30

Я пытаюсь написать push-сервер для iPhone на C #. У меня есть следующий код:

        // 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;
                }
            }

ЭСТ ....

Только я продолжаю получать исключение: & quot; Сбой вызова SSPI, см. Внутреннее исключение & quot; Внутреннее исключение - & gt; & quot; полученное сообщение было неожиданным или плохо отформатировано. & quot;

Кто-нибудь знает, что здесь происходит не так?

Это сработало для вас? Zanoni
Вы используете моно на вашем iPhone? slypete
Догадаться. Заменен sslStream.AuthenticateAsClient (& quot; gateway.sandbox.push.apple.com & quot;); with sslStream.AuthenticateAsClient (& quot; gateway.sandbox.push.apple.com & quot ;, clientCertificateCollection, SslProtocols.Default, false); И прописал сертификаты на ПК. Kyle
Вы должны ответить на свой вопрос, чтобы закрыть его. djangofan
Да, у меня все работает и могу отправлять сообщения на мой iPhone. Не забудьте зарегистрировать свой файл .p12 в Windows. Kyle

Ваш Ответ

6   ответов
1

Я недавно использовалРычание для Windows отправлять сообщения клиенту Prowlна айфоне из .Net кода, Таким образом, вы можете получить свою функциональность без написания push-сервера самостоятельно.

Error: User Rate Limit Exceeded Kyle
0

В моем случае мне пришлось удалить все сертификаты из моей Windows 8, а затем переустановить их, чтобы отправить push-уведомления на устройство Apple.

Я не знаю, почему мои сертификаты перестают работать, я ищу правильную причину и скоро обновлю здесь.

0

& Quot; Полученное сообщение было неожиданным или плохо отформатировано. & Quot; Обычно ошибка возникает, когда вы не зарегистрировали сертификат p12 в Windows. (В Vista просто дважды щелкните файл p12, и откроется мастер импорта)

8

Догадаться. Заменен sslStream.AuthenticateAsClient (& quot; gateway.sandbox.push.apple.com & quot;); with sslStream.AuthenticateAsClient (& quot; gateway.sandbox.push.apple.com & quot ;, clientCertificateCollection, SslProtocols.Default, false); И прописал сертификаты на ПК.

Изменить: Вот код для создания полезной нагрузки в соответствии с запросом:

    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
Error: User Rate Limit Exceeded
1

ificateCollection2.

5

Из комментария Zenox: использовать другую версию AuthenticateAsClient

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

Похожие вопросы