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

时间:2019-01-10 10:39:31

标签: php laravel apple-push-notifications

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

我在Internet上搜索解决方案,发现的一个解决方案是设置通知到期时间。因此,我通过解决我的实际问题来实施了此解决方案。

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

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 个答案:

答案 0 :(得分:2)

根据文档,您无法做您打算做的事情。这是记录的行为:

  

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

这意味着每个应用每个用户的离线通知。

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