Незарегистрированная ошибка маркера после отправки одного уведомления

я сталкиваюсь с этой драматической проблемой с моим Android-приложением при использовании Firebase. 1. Мое приложение получает токен при первом запуске 2. Я могу отправить уведомление с консоли firebase на зарегистрированный токен 3. Если я попытаюсь отправить уведомление снова с помощью консоли сразу после шага 2. Он показывает мне "незарегистрированный токен" после 2-й попытки.

у меня уже есть вся необходимая конфигурация в манифесте и сервисе google.файл json также находится на месте с правильным конфигурация. Я считаю, что все правильно, потому что приложение может получать уведомления один раз, и проблема начинает приходить только после этого.

обновление 1: Если я удалю приложение и переустановить его, то также я могу получить уведомление только один раз.

те, кто хочет посмотреть на код, вот как я получаю токен:

@Override
public void onTokenRefresh() {

    //Getting registration token
     refreshedToken = FirebaseInstanceId.getInstance().getToken();

    //Displaying token on logcat
    Log.d(TAG, "Refreshed token: " + refreshedToken);
     saveDeviceToken(refreshedToken);
}

Это вызывает только первый запуск, и после этого я не видел, как он вызывается (что, я думаю, ожидается поведение.)

onmessage получил также вызывается на первом уведомлении, а затем он никогда не отменяется:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d("FCM", "From: " + remoteMessage.getFrom());

    if (remoteMessage.getNotification() != null) {
        Log.d("FCM", "Notification Message Body: " + remoteMessage.getNotification().getBody());
        sendNotification(remoteMessage.getNotification().getBody());
    }
}

обновление 2 : Пытался попасть в HTTP api FCM, используя тот же ключ сервера и токен, и получил следующий ответ:

   {
  "multicast_id": 6286279702096230688,
  "success": 0,
  "failure": 1,
  "canonical_ids": 0,
  "results": [
    {
      "error": "NotRegistered"
    }
  ]
}

просто, чтобы избежать перекрестных вопросов вот еще несколько деталей:

  • Android studio: v2.3.1
  • версия сервиса Google play: 10.0.1
  • библиотеки входят : основной, база данных, хранение, обмен сообщениями-все имеет ту же версию, что и Google play service 10.0.1

обновление 3: сбой Firebase, база данных и хранилище работают в одном проекте (который показывает, что служба google.файл json правильный).

пожалуйста, помогите мне исправить это.

4 ответов


маркер регистрации может измениться, когда:

  • приложение удаляет идентификатор экземпляра
  • приложение восстановлены на новом устройстве!--5-->
  • пользователь удаляет/переустановить приложение
  • пользователь очищает данные приложения.

вы можете увидеть документацию здесь

и вы можете читать здесь также об ошибках fcm это происходит только для режима отладки, поэтому вы можете вызвать этот метод в своей деятельности запуска это будет принимать сертификат HTTPS сервера тестирования/разработки, так как сертификат HTTPS недействителен /не доверен В релизе все будет хорошо.

private void RegisterFireBase()
        {

if (BuildConfig.DEBUG) {    
            Task.Run(() =>
            {
                var instanceId = FirebaseInstanceId.Instance;
                instanceId.DeleteInstanceId();
                Android.Util.Log.Debug("TAG", "{0} {1}", instanceId?.Token?.ToString(), instanceId.GetToken(GetString(Resource.String.gcm_defaultSenderId), Firebase.Messaging.FirebaseMessaging.InstanceIdScope));

            });


            ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true;



        }

Я помню, что сталкивался с подобной проблемой раньше. Вот что я сделал, и это работает гладко для меня. Надеюсь, это поможет,

PreferenceStore-вспомогательный класс для сохранения, редактирования и удаления общих настроек.

@Override
public void onTokenRefresh() {
    String token = FirebaseInstanceId.getInstance().getToken();
    Log.i(TAG, "New FCM Token: " + token);

    setup_flag = PreferenceStore.getBoolean(getApplicationContext(), PrefKeys.IS_FIRST_FCM_TOKEN);
    if (!setup_flag) {
        // save token and boolean value in shared preferences for 
        // the first time you run the app after install
        PreferenceStore.saveString(getApplicationContext(), "FCM_TOKEN", token);
        PreferenceStore.saveBoolean(getApplicationContext(), "IS_FIRST_FCM_TOKEN", true);
    } else {
        // other time your app loads, update the token (like call the API endpoint).
    }
}

FCM является противоположностью GCM.

при использовании классов GCM TokenID обновляется время от времени, поэтому он также обновляется в базе данных на сервере.

при использовании FCM. Базовая архитектура FCM работает на уникальном TokenID, поэтому onTokenRefresh не вызывает несколько раз. Он вызывает только один раз.

то, что вы должны сделать, это просто сохранить ваш изначально сгенерированный TokenID и использовать его соответственно.

P. S:в FCM токен не обновляется, пока и если приложение не будет переустановлено.


вот как я исправил.

Как указано всеми, что имя пакета .файл json может быть основной причиной этого сбоя, который стал правдой и здесь, но с изюминкой.

Я скачал .файл json из Firebase и предполагал, что это правильно .файл json загружался. К сожалению, из-за какой-то ошибки в Firebase при загрузке файла я всегда получал .JSON-файл некоторых моих других проектов (приложение firebase). Об инвестировании скачанного файл, я понял это и изменил имя пакета и ключи вручную .файл json.

Я предложил всем проверить включенное .файл json, прежде чем пытаться что-либо еще, как это является основной причиной этого типа проблемы.