【问题标题】:How to send iOS Push Notifications using TLS and PHP?如何使用 TLS 和 PHP 发送 iOS 推送通知?
【发布时间】:2014-12-22 01:24:13
【问题描述】:

我的应用仍在开发中,我使用本教程使用 PHP 和 SSL 发送 iOS 推送通知。

http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1

它工作正常,但最近贬值了,因为 Apple 最近决定放弃 SSL,立即影响所有开发中的应用,而生产中的应用必须在 10 月 29 日之前更改其代码。

我想知道如何使用 TLS 而不是 SSL 来做同样的事情。

这是我以前工作的 php 的样子:

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

我尝试按照 Apple 的建议添加 Entrust 证书:

$ctx = stream_context_create();
stream_context_set_option($ctx, 'tls', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'tls', 'passphrase', $passphrase);
stream_context_set_option($ctx, 'tls', 'cafile', 'entrust_2048_ca.cer');
$fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

但它仍然不起作用。你有什么建议可以解决吗?

【问题讨论】:

    标签: php ssl notifications push


    【解决方案1】:
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
    stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');
    $fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    

    如果您在 localhost 环境中工作,请不要忘记下载认证文件 entrust_2048_ca.cer

    【讨论】:

    • 还是不行。它不适用于 localhost 环境,因为我正在我的服务器上进行测试。同样,在苹果宣布之前,一切都过去了。还有什么建议吗?谢谢。
    • 对我来说它也不起作用。我已经从 entrust.net/downloads/root_request.cfm 下载了 entrust_2048_ca.cer,添加了 cafile 选项,并将 URL 架构的 ssl 更改为 tsl。结果相同 - 它说消息已成功传递,但设备上没有消息。如果是使用另一种方式(使用 ruby​​)发送消息 - 是已传递。
    • 它至少在本地环境中工作。尚未在服务器端进行测试,但它可以工作。
    【解决方案2】:
    <?php
    $message = 'aa_' . rand(10000,99999);
    
    $deviceToken = array(
        'xxxxxx'
    );
    
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'passphrase', '111111');
    stream_context_set_option($ctx, "ssl", "local_cert", './apns.pem');
    
    $fp = NULL;
    $errno = NULL;
    $errstr = NULL;
    
    $fp = stream_socket_client("tls://gateway.sandbox.push.apple.com:2195", $errno, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    
    if($fp === FALSE){
        exit('error message');
    }
    
    $content = array("aps" => array("alert" => $message, "badge" => 4, "sound" => 'default', "code" => 200));
    $data = json_encode($content);
    
    foreach ($deviceToken as $token) {
        $msg = chr(0) . pack("n", 32) . pack("H*", $token) . pack("n", strlen($data)) . $data;
        fwrite($fp, $msg);
        fflush($fp);
    }
    
    fclose($fp);
    

    【讨论】:

      【解决方案3】:

      这里有一些提示可以帮助您弄清楚:

      1. 转到entrust.net/downloads/root_request.cfm并下载entrust_2048_ca.cer

      2. 添加以下代码: stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');

      3. 确保路径是否正确:'../folder/file/ck.pem' ?

      4. 切换并尝试沙盒和实时 ssl 链接。

      5. 切换开发和生产 pem 并尝试两者。

      【讨论】:

        猜你喜欢
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        相关资源
        最近更新 更多