【问题标题】:Send push notification to ios app : Google cloud向 ios 应用发送推送通知:谷歌云
【发布时间】:2015-07-22 11:32:57
【问题描述】:

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

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

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

警告:stream_socket_client(): SSL: Connection reset by peer

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

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

我对 Google Cloud 不太熟悉。我应该怎么做才能让它工作?

代码如下:

$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;

【问题讨论】:

  • 什么云? Compute Engine 还是 App Engine?
  • 这是计算引擎
  • 您是在打开连接、发送消息、关闭连接,然后再循环执行一遍吗?
  • @SantoshJagtap:是的。我也尝试过单个通知,但同样的错误。
  • 您在使用证书吗?当我使用坏证书时,这发生在我身上。检查您的代码和证书,以确保一切正常。先用沙盒 APNS 测试服务器测试一下

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


【解决方案1】:

当我们尝试向 APNS(Apple Push Notification Service)服务器发送数据时,主要问题是 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 推送通知。

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多