2009-06-28 40 views
30

Tôi đang cố gắng viết một máy chủ đẩy cho iPhone trong C#. Tôi có đoạn mã sau:C# iPhone đẩy máy chủ?

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

vv ....

Chỉ có tôi tiếp tục nhận được một ngoại lệ: "Một cuộc gọi đến SSPI thất bại, xem ngoại lệ bên trong" Nội ngoại lệ -> "Thông điệp nhận được bất ngờ hoặc bị định dạng sai. "

Có ai có ý tưởng gì không ổn ở đây không?

+6

Đã tìm ra. Đã thay thế sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com"); với sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); Và đã đăng ký chứng chỉ trên PC. – Kyle

+0

Nó phù hợp với bạn? – Zanoni

+0

Có, tôi có mọi thứ hoạt động và có thể đẩy tin nhắn vào iPhone của mình. Đừng quên đăng ký tập tin .p12 của bạn với các cửa sổ. – Kyle

Trả lời

8

đặn nó ra. Đã thay thế sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com"); với sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); Và đăng ký chứng chỉ trên PC.

Edit: Đây là đoạn mã để tạo ra một tải trọng theo yêu cầu:

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

Tôi nên sử dụng thư mục nào (Certificate Store) để nhập vào trên Windows Server? Nhà xuất bản cá nhân hay đáng tin cậy? Tôi đã thử "Mặc định chọn dựa trên loại chứng chỉ" nhưng không làm việc. –

1

Cách khác là sử dụng các lớp X509Certificate2 và X509CertificateCollection2.

1

Gần đây, tôi đã sử dụng Growl For Windows để đẩy tin nhắn đến ứng dụng khách Prowl on the IPhone from .Net code. Vì vậy, bạn có thể nhận được chức năng của bạn mà không cần viết một máy chủ đẩy mình.

+0

Điều đó có thể làm việc để đẩy dữ liệu vào APN, nhưng còn xử lý phản hồi thì sao? – Kyle

0

"Thông báo nhận được không mong muốn hoặc bị định dạng sai". lỗi thường xuất hiện khi bạn không đăng ký chứng chỉ p12 trong Windows. (Theo Vista, chỉ cần nhấp đúp vào file p12 và hướng dẫn nhập khẩu sẽ mở ra)

5

Từ bình luận Zenox của: sử dụng một phiên bản khác của AuthenticateAsClient

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

Trong trường hợp của tôi, tôi đã phải xóa tất cả các chứng từ cửa sổ của tôi 8 và sau đó cài đặt lại chúng theo thứ tự gửi thông báo đẩy cho thiết bị táo.

Tôi không biết tại sao chứng chỉ của tôi ngừng hoạt động, tôi đang tìm kiếm lý do chính xác và sẽ sớm cập nhật tại đây.

Các vấn đề liên quan