设备离线时,apns 丢弃了旧的推送通知

Posted

技术标签:

【中文标题】设备离线时,apns 丢弃了旧的推送通知【英文标题】:apns discarded the old push notification while device offline 【发布时间】:2019-01-10 10:39:31 【问题描述】:

我正在处理推送通知,我想使用 phpios 发送聊天推送通知。但是当我向 apns(Apple Push Notification Server)发送 5 个推送通知时,apns 会丢弃旧的推送通知,并在设备上线时仅向设备发送最新的推送通知。

我在互联网上搜索解决方案,我找到的一个解决方案是设置通知到期时间。所以我通过我的实际问题没有解决来实现这个解决方案。

有什么办法可以解决我的问题。建议任何有用的解决方案或参考网站。

IOS push notification with PHP

下面是我的示例代码

public function sendIOSNotification($tokens, $data, $envoirement = 'production') 
        try 

            $payload = json_encode($this->setIosNotificationDataParameters($data));
            $deviceTokens = str_replace(array(' ', '<', '>'), '', $tokens['ios']);
            // FUNCTION NOTIFICATIONS   
            $ctx = stream_context_create();
            stream_context_set_option($ctx, 'ssl', 'local_cert', config('push-notification.appNameIOS.certificate_' . $envoirement));
            stream_context_set_option($ctx, 'ssl', 'passphrase', 'push');
            //send notification 
            $fp = stream_socket_client(
                    config('push-notification.appNameIOS.ios_push_notification_' . $envoirement), $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx
            );
            $res = [];
            foreach ($deviceTokens as $deviceToken) 
                $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) 
                . pack('n', strlen($payload)) . $payload
                .pack('N', time()).pack('N', time() + 86400);
                $res = json_encode($result);
            
            fclose($fp);
            \Log::info("=== IOS Notification Send Successfully ===");
            return true;
         catch (\Exception $ex) 
            $messages = $ex->getMessage() . '::' . $ex->getFile() . '( ' . $ex->getLine() . ' )';
            \Log::ifno("===Push Notificaion Exception===");
            \Log::ifno($messages);
            return true;
        
    

【问题讨论】:

【参考方案1】:

你不能按照文档做你想做的事。这是记录在案的行为:

服务质量、存储转发和合并通知 Apple 推送通知服务包括服务质量 (QoS) 执行存储转发功能的组件。如果 APNs 尝试 发送通知并且目标设备离线,APNs 将通知存储一段有限的时间并传递它 当设备再次可用时。 此组件仅存储 每个设备和每个应用的最新通知。如果一个设备是 离线,发送针对该设备的通知请求导致 先前的请求被丢弃。如果设备保持离线状态 很长一段时间,它在 APNs 中存储的所有通知都会被丢弃。 来源:apple push notifications documentation

这意味着每个用户每个应用只发送一个离线通知。

您应该以不同的方式构建您的应用程序。首先,对于聊天应用程序,您不能指望在设备重新联机时发送数千个推送通知。如果您想在您的应用中显示旧消息,您必须为您的应用实施一些额外的机制来检索旧消息

【讨论】:

以上是关于设备离线时,apns 丢弃了旧的推送通知的主要内容,如果未能解决你的问题,请参考以下文章

当用户在Android中使用XMPP离线时向用户发送通知

用户离线时Openfire发送推送通知

iOS - 从 APNS 重新发送 Apple 推送通知

iOS:从 AWS SNS 向 APNS 发送推送通知

iOS APN 推送通知 - 设备令牌

我们可以从 iOS 设备向 APNs 发送推送通知吗?