2009-06-28 121 views
30

我试图在C#中为iPhone编写推送服务器。我有以下代码:C#iPhone推送服务器?

 // 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调用失败,请参见内部异常” 内部异常 - >“收到的消息出乎意料或格式不正确。“

有没有人有任何想法这里怎么了?

+6

想通了。替换为 sslStream.AuthenticateAsClient(“gateway.sandbox.push.apple.com”); with sslStream.AuthenticateAsClient(“gateway.sandbox.push.apple.com”,clientCertificateCollection,SslProtocols.Default,false); 并在PC上注册证书。 – Kyle 2009-06-29 00:15:37

+0

它适合你吗? – Zanoni 2009-07-03 17:10:14

+0

是的,我有一切工作,并可以推送消息到我的iPhone。不要忘记用windows注册你的.p12文件。 – Kyle 2009-07-06 22:26:02

回答

8

想通了。替换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 
1

其他方法就是使用X509Certificate2和X509CertificateCollection2类。

0

“收到的消息是意外或格式错误。”当您没有在Windows中注册p12证书时,通常会出现错误。 (在Vista下,刚上P12双击文件,然后导入向导将打开)

5

从Zenox的评论: 使用不同版本的AuthenticateAsClient

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

在我而言,我不得不从我的Windows 8中删除所有的证书,然后才能发送推送通知重新安装它们到苹果设备。

我不知道为什么我的证书停止工作,我正在寻找正确的原因,并会尽快在此更新。