Firebase onTokenRefresh() не называется



в своем MainActivityв моем журнале я вижу токен с помощью FirebaseInstanceId.getInstance().getToken() и он отображает сгенерированный токен. Но это похоже на мой MyFirebaseInstanceIDService где он распространяется на FirebaseInstanceIdService на onTokenRefresh() не вызывается, где в этой функции было сказано, что знак изначально создан здесь. Мне нужно было позвонить sendRegistrationToServer() вот почему я пытаюсь понять, почему он не идет в onTokenRefresh().



вот мой код



public class MyFirebaseInstanceIDService  extends FirebaseInstanceIdService {


@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);

sendRegistrationToServer(refreshedToken);
}
}
650   12  

12 ответов:

onTokenRefresh в FirebaseInstanceIdService вызывается только при создании нового токена. Если ваше приложение было ранее установлено и сгенерировано токен, то onTokenRefresh не будет вызван. Попробуйте удалить и переустановить приложение, чтобы принудительно создать новый токен, это приведет к вызову onTokenRefresh.

также убедитесь, что ваш FirebaseInstanceIdService правильно определен в вашем AndroidManifest.xml

в Манифесте Файл.

 <service
        android:name="com.bnt.etailers.fcm.MyFireBaseInstanceIDService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

    <service
        android:name="com.bnt.etailers.fcm.GCMNotificationIntentService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

FirebaseInstanceIdService class

public class MyFireBaseInstanceIDService extends FirebaseInstanceIdService {


private static final String TAG = MyFireBaseInstanceIDService.class.getSimpleName();

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    if (refreshedToken!=null) {
        SettingPreferences.setStringValueInPref(this, SettingPreferences.REG_ID, refreshedToken);
    }
    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]

/**
 * Persist token to third-party servers.
 *
 * Modify this method to associate the user's FCM InstanceID token with any server-side account
 * maintained by your application.
 *
 * @param token The new token.
 */
private void sendRegistrationToServer(String token) {
    // Add custom implementation, as needed.
}}

класс FirebaseMessagingService.

public class GCMNotificationIntentService extends FirebaseMessagingService {
// Sets an ID for the notification, so it can be updated


public GCMNotificationIntentService() {
    super();
}


@Override
public void onMessageReceived(RemoteMessage message) {

}}

у меня была такая же проблема, как и у тебя. Моя ошибка была следующей: я поместил мой <service> теги за пределы <application> тег в AndroidManifest.XML-файл.

Теперь мой выглядит так:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <service
        android:name=".MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

    <service
        android:name=".MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
</application>

и все работает без каких либо проблем.

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

Да это может произойти несколько раз.

пожалуйста, вызовите следующий метод, где вы хотите получить свой идентификатор fcm.

    try {
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
        } catch (Exception e) {
            e.printStackTrace();
        }

в моем случае я забыл добавить разрешение интернета в манифесте,

<uses-permission android:name="android.permission.INTERNET" />

надеюсь, что большинство людей не будет делать эту ошибку.

try {
    FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
    e.printStackTrace();
}

на onCreate метод удаления маркера.

убедитесь, что вы добавили

применить плагин: 'com.гуглить.СБМ.google-services'

этого в нижней части приложения.gradle file

в моем случае, я пробовал все, но onTokenRefresh никогда не назывался. Тогда я меняю свой WiFi и я подключаюсь к разным сеть, Теперь он работал!!. Предыдущий WiFi имеет хорошее подключение к интернету, не знаю, почему это происходит. Может быть, это может помочь кому-то.

переустановка сделал трюк для меня!

Я испытал, что MyFirebaseInstanceIDService не вызывается при запуске приложения на устройстве, где подключение к интернету не доступно. Таким образом, onTokenRefresh () не называется. Поэтому убедитесь, что ваше устройство должно иметь подключение к интернету во время запуска вашего приложения для принятия обновленного FirebaseToken.

также удалите предыдущее приложение & Переустановить для принятия обновленного маркера. Регистрационный маркер изменения когда:

1) приложение удаляет идентификатор экземпляра

2) приложение восстанавливается на новом устройстве

3) пользователь удаляет/переустановить приложение

4) пользователь очищает данные приложения.

я боролся с этим более часа, затем я изменил следующий код, и он внезапно сработал.

обрабатывать refreshedToken как таковой:

String refreshedToken;
    try {
        refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
        Localytics.setPushRegistrationId(refreshedToken);
    } catch (Exception e) {
        Log.d(TAG, "Refreshed token, catch: " + e.toString());
        e.printStackTrace();
    }

попробуйте добавить android: exported= "true" > как в MyFirebaseMessagingService, так и в MyFirebaseInstanceIDService в манифесте, так что это выглядит так:

<service
        android:name="com.localytics.android.sample.fcm.MyFirebaseMessagingService"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

    <service
        android:name="com.localytics.android.sample.fcm.MyFirebaseInstanceIDService"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

удалить приложение, установить снова, работал. Протестировано на реальном устройстве.

android: exported= "true" является опцией по умолчанию, так что вы можно также удалить это полностью, и он будет установлен в true.

также, если вы хотите вызвать onTokenRefresh более явно, вы можете просто вызвать это в любом месте вашего кода:

String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Localytics.setPushRegistrationId(refreshedToken);

вам больше не нужно полагаться на то, что трансляция будет получена

У меня была та же проблема. Мое устройство (kitkat 4.4.2) по какой-то причине не смогло получить onTokenRefresh (). Мое подключение к интернету было идеальным, сервисы google play были обновлены, и все необходимые условия для работы firebase были выполнены. Мой код отлично работал на устройствах 5.0.0 и выше. Чтобы решить эту проблему, мне пришлось сбросить настройки моего устройства до заводских настроек, и приложение начало работать. Я знаю, что это жесткая мера, но, возможно, это может помочь кому-то. Там должны быть какие-то проблемы или конфликт с другое приложение, которое вызвало onTokenRefresh () не вызывается. Удачи вам!

Comments

    Ничего не найдено.