我试图弄清楚为什么以下代码适用于沙箱APNS网关,而不是生产沙箱。
public byte[] ToByteArray(string str)
{
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
return enc.GetBytes(str);
}
public static bool ValidateServerCertificate(Object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
return true; // yah, I'm sure.
}
public void sendMessage()
{
var debugApp = false;
int port = 2195;
String hostname = "gateway.push.apple.com";
if (debugApp)
{
hostname = "gateway.sandbox.push.apple.com";
}
//load certificate
string certificatePath = @"C:\APNsPush\ABC_Prod_Cert.p12";
if (debugApp)
{
certificatePath = @"C:\APNsPush\ABC_Dev_Cert.p12";
}
string certificatePassword = "";
X509Certificate2 clientCertificate =
new X509Certificate2(certificatePath, certificatePassword);
X509Certificate2Collection certificatesCollection =
new X509Certificate2Collection(clientCertificate);
TcpClient client = new TcpClient(hostname, port);
SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
null
);
try
{
sslStream.AuthenticateAsClient(hostname,
certificatesCollection,
SslProtocols.Tls,
true);
}
catch (AuthenticationException ex)
{
client.Close();
return;
}
// Encode a test message into a byte array.
MemoryStream memoryStream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(memoryStream);
writer.Write((byte)0); //The command
writer.Write((byte)0); //The first byte of the deviceId 1st (big-endian first byte)
writer.Write((byte)32); //The deviceId length (big-endian 2nd byte)
String deviceId = "1c40118b69624a6eec7cf74d353d3600b73e062a25c00d3ee5c462086eae9e97";
writer.Write(ToByteArray(deviceId.ToUpper()));
if (debugApp)
{
deviceId = "d97fb8bf277471494a0d11d0a89a6866342bdd4aca4acb1edbd3cd6308f7a9f6";
writer.Write(ToByteArray(deviceId.ToUpper()));
}
String payload = "{\"aps\":{\"alert\":\"Hello World\",\"badge\":1}}";
writer.Write((byte)0); //First byte of payload length; (big-endian 1st byte)
writer.Write((byte)payload.Length); //payload length (big-endian 2nd byte)
byte[] b1 = System.Text.Encoding.UTF8.GetBytes(payload);
writer.Write(b1);
writer.Flush();
byte[] array = memoryStream.ToArray();
sslStream.Write(array);
sslStream.Flush();
// Close the client connection.
client.Close();
}
如果我将debugApp
从false
翻转到true
,并使用开发证书编译相关应用,然后触发sendMessage
我就会得到一个可爱的" Hello World"在我的应用中弹出通知。
如果我将debugApp
从后面翻转到false
,并使用分发证书重新编译相关应用程序(作为Beta发布并使用TestFlight下载),然后触发sendMessage
我得到我的应用中没有显示任何通知。
我能够远程登陆网关
telnet gateway.push.apple.com 2195
所以我有理由相信我没有被防火墙阻挡。
[开始编辑]
我打了一个小的PushSharp应用程序,我可以通过这种方式向我的应用程序发送消息。这证实它在我的工作站上不是防火墙问题。
但是,由于我不打算进入原因,原始应用程序无法使用PushSharp。
[结束编辑]
即使从生产pem
生成p12
文件到此网站http://apns-gcm.bryantan.info/并发送带有生产的消息,我也是如此。该消息确实通过我的使用分发证书编译的应用程序。因此,我确信p12
文件是正确的。
(是的,我知道我应该重新生成p12
,因为它现在已经通过使用其他网站而受到有效影响了)
我错过了什么?