Проблема с уведомлением FCM push: - "ошибка": "не зарегистрирован"

Я получаю странную проблему отправки 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-уведомления.

каждый раз, когда я вызываю функцию выше, я получаю

"ошибка":"NotRegistered"

любая помощь будет оценили.

спасибо заранее.

3 ответов


Не знаю много о php, но недавно я столкнулся с той же проблемой в другом проекте, и я решил так :

Refere это сначала : где я могу найти ключ API для Firebase Cloud Messaging?

и получить обновленный ключ API, как показано ниже snapshotenter image description here


согласно doc its, потому что тестирование мобильных устройств больше не имеет вашего приложения

Если он не зарегистрирован, вы должны удалить идентификатор регистрации из база данных сервера, поскольку приложение было удалено из устройство или клиентское приложение не настроено для приема сообщений.


это проблема на стороне клиента (устройства), а не на стороне службы. Это может быть вызвано несколькими сценариями:

  • если клиентское приложение отменяет регистрацию с GCM.
  • если клиентское приложение автоматически не зарегистрировано, что может произойти, если пользователь удалит приложение. Например, в iOS, если служба обратной связи APNS сообщил маркер APNS как недопустимый.
  • если срок действия регистрационного маркера истекает (например, Google может решить обновить регистрационные маркеры или Токен APNS истек для устройств iOS).
  • если клиентское приложение обновлено, но новая версия не настроена для приема сообщений.

см.https://developers.google.com/cloud-messaging/http-server-ref

при запуске приложения я проверяю, соответствует ли токен, который я сохранил локально, новому токену. Если нет, я обновляю токен на своих серверах. Я также делаю это в FirebaseInstanceIDService::onTokenRefresh.