2009-06-28 7 views
30

Sto tentando di scrivere un server push per l'iPhone in C#. Ho il seguente codice:C# server push di 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 ....

Solo Continuo a ricevere un'eccezione: "Una chiamata a SSPI non è riuscita, vedere Eccezione interna" interno Eccezione -> "Il messaggio ricevuto era inaspettato o mal formattato. "

Qualcuno ha qualche idea di cosa sta andando storto qui?

+6

Capito. Sostituito sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com"); con sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); E registrato i certificati sul PC. – Kyle

+0

Ha funzionato per te? – Zanoni

+0

Sì, ho tutto a posto e posso inviare messaggi al mio iPhone. Non dimenticare di registrare il tuo file .p12 con Windows. – Kyle

risposta

8

capito. Sostituito sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com"); con sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); E registrato i certificati sul PC.

Edit: Ecco il codice per la creazione di un carico utile come richiesto:

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

Quale cartella (archivio certificati) devo usare per importare su su Windows Server? È un editore personale o affidabile? Ho provato "Selezione predefinita basata sul tipo di certificato" ma non ha funzionato. –

1

Un altro modo è utilizzare solo le classi X509Certificate2 e X509CertificateCollection2.

1

Recentemente ho utilizzato Growl For Windows per inviare messaggi al client Prowl on the IPhone from .Net code. Quindi potresti ottenere la tua funzionalità senza scrivere tu stesso un server push.

+0

Potrebbe funzionare per spingere i dati nell'apn, ma per quanto riguarda la gestione del feedback? – Kyle

0

"Il messaggio ricevuto è stato inaspettato o formattato in modo errato". l'errore di solito arriva quando non hai registrato il certificato p12 in Windows. (In Vista, si apriranno basta fare doppio clic sul file p12 e la procedura guidata di importazione)

5

Dal commento di Zenox: utilizzare una versione diversa di AuthenticateAsClient

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

Nel mio caso ho dovuto cancellare tutto il certificato dalle mie finestre 8 e poi reinstallare per inviare notifiche push al dispositivo Apple.

Non so perché i miei certificati smettono di funzionare, sto cercando il motivo corretto e aggiornerò qui a breve.