web-dev-qa-db-ja.com

C#iPhoneプッシュサーバー?

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

ect ....

私だけが例外を受け取り続けます:「SSPIへの呼び出しが失敗しました。内部例外を参照してください」内部例外->「受信したメッセージが予期しないか、フォーマットが正しくありませんでした。」

誰かがここで何がうまくいかないのか考えていますか?

30
Kyle

理解した。 sslStream.AuthenticateAsClient( "gateway.sandbox.Push.Apple.com");を置き換えました。 sslStream.AuthenticateAsClient( "gateway.sandbox.Push.Apple.com"、clientCertificateCollection、SslProtocols.Default、false);を使用します。そして、PCに証明書を登録しました。

編集:要求に応じてペイロードを作成するためのコードは次のとおりです。

    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
8
Kyle

Zenoxのコメントから:異なるバージョンのAuthenticateAsClientを使用する

sslStream.AuthenticateAsClient( "gateway.sandbox.Push.Apple.com"、clientCertificateCollection、SslProtocols.Default、false);
5
Michael Donohue

私は最近 Growl For Windows を使用してメッセージをProwlクライアントにプッシュしました 。NetコードからのiPhone上で 。したがって、プッシュサーバーを自分で作成しなくても機能を利用できる可能性があります。

1
tobsen

もう1つの方法は、X509Certificate2クラスとX509CertificateCollection2クラスを使用することです。

1
shader

私の場合、プッシュ通知をAppleデバイスに送信するために、Windows 8からすべての証明書を削除してから、それらを再インストールする必要がありました。

証明書が機能しなくなる理由がわかりません。正しい理由を探しています。まもなくここで更新されます。

0
muhammad kashif

「受信したメッセージが予期しないものであったか、形式が正しくありませんでした。」通常、Windowsでp12証明書を登録しなかった場合にエラーが発生します。 (Vistaでは、p12ファイルをダブルクリックするだけで、インポートウィザードが開きます)

0
Ronan