IPhone用のプッシュサーバーをC#で書き込もうとしています。私は次のコードを持っています:
// 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 ....
私だけが例外を受け取り続けます:「SSPIへの呼び出しが失敗しました。内部例外を参照してください」内部例外->「受信したメッセージが予期しないか、フォーマットが正しくありませんでした。」
誰かがここで何がうまくいかないのか考えていますか?
理解した。 sslStream.AuthenticateAsClient( "gateway.sandbox.Push.Apple.com");を置き換えました。 sslStream.AuthenticateAsClient( "gateway.sandbox.Push.Apple.com"、clientCertificateCollection、SslProtocols.Default、false);を使用します。そして、PCに証明書を登録しました。
編集:要求に応じてペイロードを作成するためのコードは次のとおりです。
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
Zenoxのコメントから:異なるバージョンのAuthenticateAsClientを使用する
sslStream.AuthenticateAsClient( "gateway.sandbox.Push.Apple.com"、clientCertificateCollection、SslProtocols.Default、false);
私は最近 Growl For Windows を使用してメッセージをProwlクライアントにプッシュしました 。NetコードからのiPhone上で 。したがって、プッシュサーバーを自分で作成しなくても機能を利用できる可能性があります。
もう1つの方法は、X509Certificate2クラスとX509CertificateCollection2クラスを使用することです。
私の場合、プッシュ通知をAppleデバイスに送信するために、Windows 8からすべての証明書を削除してから、それらを再インストールする必要がありました。
証明書が機能しなくなる理由がわかりません。正しい理由を探しています。まもなくここで更新されます。
「受信したメッセージが予期しないものであったか、形式が正しくありませんでした。」通常、Windowsでp12証明書を登録しなかった場合にエラーが発生します。 (Vistaでは、p12ファイルをダブルクリックするだけで、インポートウィザードが開きます)