2009-06-28 7 views
30

Próbuję napisać serwer wypychania dla iPhone'a w języku C#. Mam następujący kod:C# serwer push 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 ....

Tylko trzymam odbierania wyjątek: „Wezwanie do SSPI nie powiodła się, zobacz wyjątek wewnętrzny” Wyjątek Wewnętrzna -> „otrzymanej wiadomości był nieoczekiwany lub źle sformatowany. "

Czy ktoś ma pojęcie, co tu jest nie tak?

+6

Wyliczyłem to. Zastąpiono sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com"); z sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); I zarejestrował certyfikaty na komputerze. – Kyle

+0

To zadziałało dla ciebie? – Zanoni

+0

Tak, mam wszystko działa i mogę przekazywać wiadomości do mojego iPhone'a. Nie zapomnij zarejestrować pliku .p12 w oknach. – Kyle

Odpowiedz

8

zdobione. Zastąpiono sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com"); z sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); I zarejestrował certyfikaty na PC.

Edycja: Oto kod do tworzenia ładunek na żądanie:

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

Jakiego folderu (Magazyn certyfikatów) należy użyć do zaimportowania do systemu Windows Server? Czy to jest osobisty czy zaufany wydawca? Próbowałem "Domyślny wybór na podstawie typu certyfikatu", ale nie działało. –

1

Innym sposobem jest użycie klas X509Certificate2 i X509CertificateCollection2.

1

Niedawno użyłem Growl For Windows do przekazywania wiadomości do klienta Prowl on the IPhone from .Net code. Więc możesz uzyskać swoją funkcjonalność bez pisania serwera wypychania.

+0

Może to działać w celu przesyłania danych do pliku APn, ale co z obsługą opinii? – Kyle

0

"Otrzymana wiadomość była nieoczekiwana lub źle sformatowana." błąd pojawia się zwykle, gdy nie zarejestrowałeś certyfikatu p12 w systemie Windows. (Pod Vista, wystarczy dwukrotnie kliknąć na plik p12 i kreator importu otworzy)

5

Od komentarzu Zenox za: użyć innej wersji AuthenticateAsClient

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

w moim przypadku musiałem usunąć wszystkie zaświadczenia z moich Windows 8, a następnie ponownie zainstalować je w celu wysyłania powiadomień push do urządzenia Apple.

Nie wiem, dlaczego moje certyfikaty przestały działać, szukam właściwego powodu i wkrótce się tu zaktualizuję.