iOS APNs 推送通知发送成功,但移动端未收到通知

Posted

技术标签:

【中文标题】iOS APNs 推送通知发送成功,但移动端未收到通知【英文标题】:iOS APNs push notification send successfully, but notification not receiving in mobile 【发布时间】:2021-04-28 14:51:12 【问题描述】:

自上周星期五(4 月 23 日)以来,一切正常,我收到了沙盒和生产通知。但是当我现在检查时,通知不起作用。我检查了我的 .pem 文件有效期到 2021 年 12 月,当我运行以下代码时,结果是“消息已成功传递”。我不知道发生了什么。请帮帮我。

<?php
    $deviceToken = "a9eb9cd54446b5cad4fa3636dbe822b5d420126fdbb632ef79b4bf07bfd8b6b4";
    $passphrase = 'secret';

    $message = "Hello world!";

    $ctx = stream_context_create();

    $passphrase = 'secret';
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'certi.pem');
    
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
  /* $fp = stream_socket_client(
                               'ssl://gateway.push.apple.com:2195', $err,
                               $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);*/
    $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err,$errstr, 60,STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    
    if (!$fp)
        exit("Failed to tess connect: $err $errstr" . PHP_EOL);
    
    $body = array('aps' => array('alert' => $message,'sound' => 'default','badge' => 1),'rewards_badge' => 1);
    
    $payload = json_encode($body);

    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
    $result = fwrite($fp, $msg, strlen($msg));
    if (!$result)
        echo 'Message not delivered' . PHP_EOL;
    else
        echo 'Message successfully delivered' . PHP_EOL;
    
    fclose($fp);
?>

谢谢

【问题讨论】:

【参考方案1】:

我也是。我向 Apple 提交了帮助请求,请求他们提供帮助。

我使用相同的测试脚本。我注意到ssl://gateway.sandbox.push.apple.com:2195 不再有效。 If your Apple devices aren't getting Apple push notifications

这是新域名? api.sandbox.push.apple.com:443

Sending Notification Requests to APNs

旧版端口 2195 和 2196 已弃用,2021 年 3 月后将不再受支持。

我也是。让我们像 Apex Legends 一样一起解决这个问题。

我已向 Apple 提交了 TSI。他们在 2 月 10 日发了一封电子邮件说:

2021 年 3 月 29 日,与 Apple 推送通知服务的基于令牌和证书的 HTTP/2 连接必须包含新的根证书 (AAACertificateServices 5/12/2020),以取代旧的 GeoTrust Global CA 根证书。为确保无缝过渡并避免推送通知传递失败,请在 3 月 29 日之前验证 HTTP/2 接口的旧根证书和新根证书是否都包含在每个通知服务器的信任库中。

请注意,Apple 向您颁发的 Apple Push Notification 服务 SSL 提供商证书此时不需要更新。

了解有关连接到 APN 的更多信息。

如果您有任何问题,请联系我们。

最好的问候,Apple 开发者关系

更新 - 5 月 3 日星期一,在向 Apple Dev 提交 TSI 之后

    在 Apple 迁移到新的 APNS 提供程序 API(http/2 协议)后,开发者的推送通知于 2021 年 3 月 31 日停止工作。 要继续使用推送,请参阅此页面:向 APN 发送通知请求 在该页面上,我对以下 3 项特别感兴趣:

Registering Your App with APNs

Establishing a Token-Based Connection to APNs

Generating a Remote Notification

我学到了什么?

    撤销所有与 APNS 相关的开发者帐号证书 制作新证书,这次在将它们安装到您的提供服务器时不要制作任何 PEM 文件。此外,请确保在连接到 APNS 时停止使用端口 2195,并使用 443 或 2197。

好消息?新的 APNS 提供程序 API 仍与 Objective C 兼容!

?

【讨论】:

感谢@programcode的回复,我改了ssl:api.push.apple.com:443, ssl:api.sandbox.push.apple.com:443 也试了2197,还是一样结果“消息已成功传递”但未在设备中收到通知,以及代码中的任何更改。 对我来说也一样。我仍在等待 Apple 的电子邮件回复。 嘿@muthukumaran 希望你周末愉快。我用 Apple 的回复更新了我的答案。我认为新的 API 非常透明。我想听听你以后的想法。 非常感谢...我正在等待您的回复,希望问题最终得到解决。再次感谢您.... 嗨@muthukumaran,你找到解决方案了吗

以上是关于iOS APNs 推送通知发送成功,但移动端未收到通知的主要内容,如果未能解决你的问题,请参考以下文章

PHP - APNs 消息已交付但在 iOS 设备上未收到

APNS Apple 推送通知服务未收到来自 Apple 的成功消息

推送通知不是第一次收到

调用推送接口返回成功,手机端未收到通知栏消息,该如何自检?

iOS推送通知我做错了啥? [关闭]

APNS 无效负载大小,仍然成功