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.
Recientemente utilicé Growl For Windows para enviar mensajes al cliente Prowl en el iPhone desde el código .Net . Por lo tanto, puede obtener su funcionalidad sin escribir un servidor push.