向ios应用发送推送通知:Google云

时间:2015-07-22 11:32:57

标签: php ios push-notification apple-push-notifications google-cloud-platform

我在谷歌云上托管了我的PHP代码。

我想向ios应用发送推送通知。我启用了端口2195和2196。

发送推送通知时出现以下错误:

  

警告:stream_socket_client():SSL:由对等方重置连接

     

警告:stream_socket_client():无法启用加密

     

警告:stream_socket_client():无法连接   ssl://gateway.push.apple.com:2195(未知错误)

我对谷歌云并不熟悉。我该怎么做才能让它发挥作用?

这是代码:

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', PEM_FILE_PATH . 'apns-dev.pem');

$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);

if (!$fp) {
    $data['msgs'] = "Failed to connect $err $errstr \n";
} else {
    $payload = json_encode($body);
    $msg = chr(0) . pack("n", 32) . pack("H*", str_replace(" ", "", $deviceToken)) . pack("n", strlen($payload)) . $payload;

    $result = fwrite($fp, $msg);

    if (!$result) {
        $data['msgs'] = 'Message not delivered'; //. PHP_EOL;
    } else {
        $data['msgs'] = 'Success'; //. PHP_EOL;
    }

    fclose($fp);
}
return $data;

1 个答案:

答案 0 :(得分:1)

我们尝试向APNS(Apple推送通知服务)服务器发送数据时的主要问题是 SSL证书

APNS使用此技术以便为其用户提供更安全的连接。

正如APNS documentation所述:“每个证书仅限于一个应用程序,并且仅限于两个开发环境中的一个,每个开发环境都有自己分配的主机名”。所以你可以使用两种环境

  • 开发(测试环境):ssl://gateway.sandbox.push.apple.com:2195

  • 制作(启动应用后):ssl://gateway.push.apple.com:2195

如果您想测试是否可以连接到APNS服务器,请尝试以下命令:

$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.

如果收到错误,请确保防火墙允许端口2195上的传出连接。

然后,您可以测试您的SSL证书和私钥是否正常工作,并且可以设置安全连接:

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert YourDevCert.pem -key YourPrivateKey.pem
Enter pass phrase for YourPrivateKey.pem: ******

如果这有效,则意味着您的证书已正确设置(您应该看到一大堆输出,这是openssl让您知道幕后发生了什么)。

一旦了解了所有这些信息,我发现您的代码中有一个错误,您还应该检查其他内容:

  • 检查您是否与APNS服务器连接良好。
  • 检查您的$payload变量是否为json字符串。
  • 检查您是否有正确的$deviceToken
  • 检查您是否使用了具有正确环境的正确证书。在这种情况下,您要设置apns-dev.pem证书并将其发送到生产环境(我认为您的生产证书是apns-prod.pem,请检查它。)
  • 检查您的PHP文件是否可以找到您的证书。
  • 您的问题之一,您没有为您的私钥设置任何密码。添加证书后,您应添加以下行:

stream_context_set_option($ctx, "ssl", "passphrase", "your_private_key");

如果您遇到麻烦或疑虑,我会按this tutorial发送我的第一个APNS推送通知。

相关问题