为什么这不适用于生产APNS网关?

时间:2016-05-26 15:59:57

标签: c# ios apple-push-notifications

我试图弄清楚为什么以下代码适用于沙箱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();
}

如果我将debugAppfalse翻转到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,因为它现在已经通过使用其他网站而受到有效影响了)

我错过了什么?

0 个答案:

没有答案