C#iPhone推送服务器?
问题描述:
我试图在C#中为iPhone编写推送服务器。我有以下代码:C#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 ....
只有我不断收到一个例外: “到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
答
其他方法就是使用X509Certificate2和X509CertificateCollection2类。
答
“收到的消息是意外或格式错误。”当您没有在Windows中注册p12证书时,通常会出现错误。 (在Vista下,刚上P12双击文件,然后导入向导将打开)
答
从Zenox的评论: 使用不同版本的AuthenticateAsClient
的sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false);
答
在我而言,我不得不从我的Windows 8中删除所有的证书,然后才能发送推送通知重新安装它们到苹果设备。
我不知道为什么我的证书停止工作,我正在寻找正确的原因,并会尽快在此更新。
想通了。替换为 sslStream.AuthenticateAsClient(“gateway.sandbox.push.apple.com”); with sslStream.AuthenticateAsClient(“gateway.sandbox.push.apple.com”,clientCertificateCollection,SslProtocols.Default,false); 并在PC上注册证书。 – Kyle 2009-06-29 00:15:37
它适合你吗? – Zanoni 2009-07-03 17:10:14
是的,我有一切工作,并可以推送消息到我的iPhone。不要忘记用windows注册你的.p12文件。 – Kyle 2009-07-06 22:26:02