apns отклонил старое push-уведомление, пока устройство не подключено - PullRequest
0 голосов
/ 10 января 2019

Я работаю над push-уведомлениями и хочу отправить push-уведомления чата в IOS с помощью php. Но когда я отправляю 5 push-уведомлений в apns (Apple Push Notification Server), apns сбрасывает старые push-уведомления и отправляет на устройство только самые последние push-уведомления, когда устройство подключается к сети.

Я ищу решение в Интернете, и одно решение, которое я нашел, - установить время истечения уведомления. Таким образом, я реализовал это решение, потому что моя реальная проблема не решена.

Есть ли способ решить мою проблему. Предложите любое полезное решение или справочный сайт.

push-уведомление IOS с 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 голосов
/ 11 января 2019

Вы не можете делать то, что вы собираетесь в соответствии с документацией. Это документированное поведение:

Качество обслуживания, хранение и пересылка и объединенные уведомления Служба Apple Push Notification включает в себя качество обслуживания (QoS) компонент, который выполняет функцию сохранения и пересылки. Если попытки APNs доставить уведомление и устройство назначения отключено, APNs сохраняет уведомление в течение ограниченного периода времени и доставляет его когда устройство снова станет доступным. Этот компонент хранит только самое последнее уведомление для устройства и приложения . Если устройство офлайн, отправка запроса на уведомление о том, что устройство предыдущий запрос должен быть отклонен. Если устройство остается в автономном режиме для долгое время все его сохраненные уведомления в APN отбрасываются. источник: документация по push-уведомлениям Apple

Это означает просто автономное уведомление для пользователя на приложение.

Вы должны разрабатывать свое приложение по-другому. Прежде всего, для приложения чата вы не можете ожидать отправки тысячи push-уведомлений, когда устройство снова подключено к сети. Вам потребуется реализовать дополнительный механизм для извлечения старых сообщений, если вы хотите показать их в своем приложении

...