使用 PHP 的 Apple 推送通知反馈服务 - 套接字错误

Posted

技术标签:

【中文标题】使用 PHP 的 Apple 推送通知反馈服务 - 套接字错误【英文标题】:Apple Push Notification Feedback Service with PHP - Socket Errors 【发布时间】:2013-04-08 13:52:45 【问题描述】:

我关注了this 使用 APNS 反馈服务的问题。这是我请求反馈服务器的代码;

function send_feedback_request() 
    //connect to the APNS feedback servers
    //make sure you're using the right dev/production server & cert combo!
    $stream_context = stream_context_create();
    stream_context_set_option($stream_context, 'ssl', 'local_cert', 'my_production_cerficate.pem');
    $apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context);
    if(!$apns) 
        die("ERROR $errcode: $errstr\n");
    


    $feedback_tokens = array();
    //and read the data on the connection:
    while(!feof($apns)) 
        $data = fread($apns, 38);
        if(strlen($data)) 
            $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
        
    
    fclose($apns);
    return $feedback_tokens;

当我使用这个功能时,它会报告以下错误;

Warning: stream_socket_client() [function.stream-socket-client]: Unable to set private key file /my_directories/my_production_cerficate.pem in /my_directories/apnsfeedback.php on line 7

Warning: stream_socket_client() [function.stream-socket-client]: failed to create an SSL handle in /my_directories/apnsfeedback.php on line 7

Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto in /my_directories/apnsfeedback.php on line 7

Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl://feedback.push.apple.com:2196 (Unknown error) in /my_directories/apnsfeedback.php on line 7

我正在使用我用于发送推送通知消息的生产证书 (.pem),它是有效的 + 工作。所以无效的证书不是这里的问题。我在这里做错了什么?

【问题讨论】:

你有证书+密钥组合在那个文件中吗?您的权限是否使 Web 服务器可以读取该文件?密钥是否受密码保护?等等等等。 我正在通过该证书发送推送通知,与 push.php 脚本位于同一目录中。所以是的,它有证书+密钥。用于推送消息的常规 pem 文件。它受密钥保护,但我无法设置密钥,因为它会出现另一个错误,提示无法设置密码...我应该使用与常规推送通知证书不同的证书吗? 【参考方案1】:

经过一番苦恼,我终于弄清楚这个问题对我来说是什么。我们的证书非常适合发送消息,但我必须创建一个没有加密或密码的证书才能处理反馈

openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem

是我们没有在我们的 pem 上用于发送推送的步骤。使用后反馈似乎还可以,但它只返回 3 个令牌,虽然我觉得我们应该有更多。

【讨论】:

此服务报告仅删除了一次设备。这有点危险,因为如果您在反馈到达的那一刻不处理反馈,您就会永远错过它。我真的希望苹果有第二个反馈 api 来返回所有已删除的设备。 那或者至少是像 GCM 这样的试运行。幸运的是,我们计划稍微频繁地向我们的用户推送消息,让他们知道新闻项目。这将允许我们轮询哪些令牌也不好。不得不说APNS的设置很不友好。

以上是关于使用 PHP 的 Apple 推送通知反馈服务 - 套接字错误的主要内容,如果未能解决你的问题,请参考以下文章

来自 APNS(Apple 推送通知服务器)的反馈服务

Apple 推送通知服务 (APNS):反馈服务响应缺少字节?

Apple 的反馈服务没有返回要删除的令牌

IIS 服务器上 PHP 中的 Apple 推送通知服务

PHP Apple Push Notifications 反馈服务

如何使用 java 编写 APNS 反馈服务?