Проблема с push-уведомлением FCM: - "ошибка": "Не зарегистрирован"
У меня возникает странная проблема с отправкой push-уведомлений на Android с помощью FCM.
Цель: - Ошибка при отправке push-уведомления
Ниже приведен сценарий, в котором у меня есть функция для отправки push-уведомлений на Android
public static function SendMultipleNotificationAndroid($groups)
{
//your api key SERVER API KEY
$apiKey = Yii::$app->params['android_api_key'];
$url = 'https://fcm.googleapis.com/fcm/send';
$headers = array(
'Authorization:key=' . $apiKey,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
foreach($groups as $resG){
$users = $resG['users'];
$msg = $resG['message'];
$type = $resG['notification_type'];
$notification_data = $resG['notification_data'];
$deviceTokens = [];
foreach($users as $resUser){
$deviceTokens[] = $resUser['device_token'];
//Add Friend badge count +1
Common::AddRemoveBadgeCount($resUser['user_id']);
}
if(!empty($deviceTokens)){
$fields = array(
'registration_ids' => $deviceTokens,
'priority' => 'high',
'collapse_key' => $resG['notification_type'],
'time_to_live' => 2419200,
"click_action" =>"NotificationListingActivity",
'data' => [
"title" => "ProjectName",
"body" => $resG['message'],
"action_tag" => $resG['notification_type'],
"message" => $resG['message'],
'notification_type' => $type,
'notification_data' => $notification_data,
'sound' => 'default',
]
);
//Print result
p($ch,0);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
curl_exec($ch);
}
}
curl_close($ch);
}
Итак, проблема в том, что когда я отправляю одно уведомление, оно работает нормально, но когда я отправляю несколько уведомлений, я каждый раз получаю ошибку
<pre>Resource id #5</pre>{"multicast_id":4818908994630396118,"success":1,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"},{"message_id":"0:1487136045570022%c3bae3c6002e9358"}]}
<pre>Resource id #5</pre>{"multicast_id":5218359780835228544,"success":1,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"},{"message_id":"0:1487136046618669%c3bae3c6002e9358"}]}
Поскольку мы отлаживаем код, у нас есть маркер устройства в нашей базе данных нет брандмауэр, который прекращает отправку push-уведомлений.
Каждый раз, когда я вызываю вышеуказанную функцию, я получаю
"ошибка": "Не зарегистрирован"
Буду признателен за любую помощь.
Заранее благодарю.
3 answers
Я мало что знаю о php, но недавно я столкнулся с такой же проблемой в другом проекте и решил ее следующим образом:
Сначала рассмотрите это : Где я могу найти КЛЮЧ API для обмена сообщениями в облаке Firebase?
И получите обновленный ключ API, как показано на приведенном ниже снимке
Согласно документу, это связано с тем, что при тестировании мобильных устройств ваше приложение больше не установлено
Если он не зарегистрирован, вам следует удалить регистрационный идентификатор из базы данных сервера, поскольку приложение было удалено с устройства или клиентское приложение не настроено для приема сообщений.
Это проблема на стороне клиента (устройства), а не на стороне службы. Это может произойти в нескольких сценариях:
- Если клиентское приложение отменяет регистрацию в GCM.
- Если клиентское приложение автоматически не регистрируется, что может произойти, если пользователь удалит приложение. Например, в iOS, если Служба обратной связи APNS сообщила, что маркер APNS недействителен.
- Если срок действия регистрационного маркера истекает (например, Google может решить обновить регистрационные маркеры или маркер APNS имеет истек срок действия для устройств iOS).
- Если клиентское приложение обновлено, но новая версия не настроена для приема сообщений.
См. https://developers.google.com/cloud-messaging/http-server-ref
При запуске приложения я проверяю, соответствует ли токен, который я сохранил локально, новому токену. Если нет, то я обновляю токен на своих серверах. Я также делаю это в FirebaseInstanceIDService::onTokenRefresh
.