Уведомления FCM не получены

# #php #firebase-cloud-messaging

Вопрос:

У меня есть веб-приложение (PHP), которое позволяет пользователям выбирать набор получателей и отправлять им сообщения, которые будут прочитаны в нашем мобильном приложении. Чтобы сообщить получателям о «получении» этого сообщения, мне нужно отправить уведомление на их телефоны через FCM.

Пакеты данных, отправленные в FCM:

 $packets[$device_token][$message_id] = [
    'notification' => [
        'title' => $msg['title'],
        'body' => $msg['content'],
        'sound' => 'default',
        'badge' => '1'
    ],
    'priority' => 'high',
    'data' => [
        // some data here
    ]
];
 

Отправка данных в FCM:

     $server_key = 'big_long_key';
    $fcm_url = 'https://fcm.googleapis.com/fcm/send';

    $headers = [];
    $headers[] = 'Content-Type: application/json';
    $headers[] = 'Authorization: key='. $server_key;

    foreach($packets as $device_token => $messages)
    {
        foreach($messages as $msg_id => $messages_to_send)
        {
            $messages_to_send['to'] = $device_token;
            $msg_json = json_encode($messages_to_send);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $fcm_url);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"POST");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $msg_json);
            curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $curl_response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

            $curl_error = null;
            if( ($httpCode != 200) || (curl_errno($ch)) )
                $curl_error = ($httpCode != 200) ? 'Firebase response not received (200)' : 'Firebase cURL error: ' . curl_strerror(curl_errno($ch));

            curl_close($ch);
            $curl_response = json_decode($curl_response, true);

            // response handling 
        }
    }
}
 

Значительное (скажем, 30%) число наших получателей сообщают, что они не получают никаких предупреждений на своих телефонах (iOS и Android). Это несмотря на то, что мы получили идентификатор сообщения от FCM для этих пользователей (который, как я полагаю, указывает на успешную отправку уведомления).

Какие проверки я должен выполнить, чтобы убедиться, что телефон получателя должен отображать/воспроизводить оповещение, и какие изменения я должен внести, чтобы убедиться, что оповещение поступает и обрабатывается должным образом?

Комментарии:

1. Попробуйте этот трюк: для тех пользователей, которые не могут получить уведомление (1) Откройте настройки в своем телефоне на Android > (2) Батарея >> (3) нажмите «Диспетчер автоматического запуска» >>> (4) установите мобильное приложение на автоматический запуск. (По моему опыту, у устройств iOS этой проблемы не будет, но вы можете проверить это дополнительно)

2. @KenLee Спасибо за это; Я видел этот совет в другом месте — проблема в том, что эти указания не работают на некоторых телефонах (включая мой собственный); нет «менеджера автоматического запуска»…

3. Для тех смартфонов, у которых нет диспетчера автоматического запуска, это может быть (1) без проблем с получением уведомления; или (2) где-то спрятано-для этого «скрытого» случая вам нужно проконсультироваться с производителем смартфона.

4. Еще один совет — вы можете установить стороннее программное обеспечение на эти скрытые телефоны «Диспетчер автоматического запуска», чтобы выполнить трюк . Просто зайдите в Google Play Store и найдите «Менеджер автоматического запуска». Удачи.

Ответ №1:

Я бы проверил, действует ли device_token по-прежнему или нет. Если токен изменился, желаемый получатель не получит уведомление.