php - 向 ios 应用程序 : Google cloud 发送推送通知

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

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

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

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

Warning: stream_socket_client(): SSL: Connection reset by peer

Warning: stream_socket_client(): Failed to enable crypto

Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error)

我对 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;

最佳答案

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

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

APNS documentation 所说:“每个证书仅限于一个应用程序,也仅限于两个开发环境之一,每个都有自己分配的主机名”。所以你可以使用两个环境

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

  • Production(应用启动后):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 证书并将其发送到 production 环境(我认为您的生产证书是 apns- prod.pem 所以检查它)。
  • 检查您的 PHP 文件是否可以找到您的证书。
  • 您的问题之一,您没有为您的私钥设置任何密码。添加证书后,您应该添加以下行:

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

如果有什么烦恼或者疑惑,我关注了this tutorial发送我的第一个 APNS 推送通知。

关于php - 向 ios 应用程序 : Google cloud 发送推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31561910/

相关文章:

ios - 在自定义 TableViewCell 中按下按钮时从 API 打开 URL

ios - 如果由我自己的服务器组成,为什么我无法发送推送通知(Firebase 云消息传递)

php - 如何使用 codeigniter 表单助手添加属性

php - 如何将 Sql 代码转换为 codeigniter 语法?

ios - 在 Swift 4 中使泛型定义可选

amazon-web-services - 如何选择重新通过 Amazon Pinpoint 接收 SMS 消息

android - getIntent() 方法未为类型 ParseApplication 定义

ios - 卡在 IOS 推送通知 (Testflight)

php - PHP 中的 MAX_FILE_SIZE - 有什么意义?

php - 如何防止最后一个换行符?