С# iPhone push-сервер?
Я пытаюсь написать 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 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;
}
}
ЭСТ....
Только я получаю исключение:
"Не удалось вызвать вызов SSPI, см. Внутреннее исключение"
Внутреннее исключение → "Полученное сообщение было неожиданным или сильно отформатированным".
Кто-нибудь знает, что здесь происходит?
Ответы
Ответ 1
Выяснил это. Заменен sslStream.AuthenticateAsClient( "gateway.sandbox.push.apple.com" ); с sslStream.AuthenticateAsClient( "gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); И зарегистрировал сертификаты на ПК.
Изменить: Вот код для создания полезной нагрузки по запросу:
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
Ответ 2
Из комментария Zenox:
используйте другую версию AuthenticateAsClient
sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false);
Ответ 3
Другой способ - просто использовать классы X509Certificate2 и X509CertificateCollection2.
Ответ 4
Недавно я использовал Growl For Windows для отправки сообщений клиенту Prowl на IPhone из .NET кода. Таким образом, вы можете получить свою функциональность без написания push-сервера самостоятельно.
Ответ 5
"Полученное сообщение было неожиданным или плохо отформатировано". ошибка обычно возникает, когда вы не регистрировали сертификат p12 в Windows. (В Vista просто дважды щелкните файл p12 и откроется мастер импорта)
Ответ 6
В моем случае мне пришлось удалить весь сертификат из моих окон 8, а затем повторно установить их для отправки push-уведомлений на яблочное устройство.
Я не знаю, почему мои сертификаты перестают работать, я искал правильную причину и скоро буду обновляться.