side c# iphone push-notification

side - C#iPhone push server?



pushsharp java (6)

Del comentario de Zenox: use una versión diferente de AuthenticateAsClient

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

Estoy intentando escribir un servidor de inserción para el iPhone en C #. Tengo el siguiente código:

// 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 sigo recibiendo una excepción: "Falló una llamada a SSPI, vea Excepción interna" Excepción interna -> "El mensaje recibido fue inesperado o mal formateado".

¿Alguien tiene alguna idea de lo que está mal aquí?


El "El mensaje recibido fue inesperado o mal formateado". el error suele aparecer cuando no se registró el certificado p12 en Windows. (En Vista, simplemente haga doble clic en el archivo p12 y se abrirá el asistente de importación)


En mi caso, tuve que eliminar todo el certificado de mi Windows 8 y luego volver a instalarlos para enviar notificaciones push al dispositivo Apple.

No sé por qué mis certificados dejan de funcionar, estoy buscando el motivo correcto y los actualizaré aquí pronto.


Lo averigué. Se reemplazó sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com"); con sslStream.AuthenticateAsClient ("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); Y registrado los certificados en el PC.

Editar: Aquí está el código para crear una carga útil según lo solicitado:

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


Otra forma es simplemente usar las clases X509Certificate2 y X509CertificateCollection2.