android - Firebase FCM 强制 onTokenRefresh() 被调用

标签 android firebase firebase-cloud-messaging

我正在将我的应用从 GCM 迁移到 FCM。

当新用户安装我的应用程序时,会自动调用 onTokenRefresh()。问题是用户还没有登录(没有用户ID)。

用户登录后如何触发onTokenRefresh()

最佳答案

每当生成新 token 时,都会调用 onTokenRefresh() 方法。应用程序安装后,它将立即生成(正如您所发现的那样)。当 token 发生变化时也会调用它。

根据 FirebaseCloudMessaging 指南:

You can target notifications to a single, specific device. On initial startup of your app, the FCM SDK generates a registration token for the client app instance.

Screenshot

Source Link: https://firebase.google.com/docs/notifications/android/console-device#access_the_registration_token

这意味着 token 注册是针对每个应用程序的。听起来您想在用户登录后使用 token 。我建议您将 onTokenRefresh() 方法中的 token 保存到内部存储或共享首选项中。然后,在用户登录后从存储中检索 token ,并根据需要向您的服务器注册 token 。

如果您想手动强制 onTokenRefresh(),您可以创建一个 IntentService 并删除 token 实例。然后,当你调用getToken时,onTokenRefresh()方法会再次被调用。

示例代码:

public class DeleteTokenService extends IntentService
{
    public static final String TAG = DeleteTokenService.class.getSimpleName();

    public DeleteTokenService()
    {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent)
    {
        try
        {
            // Check for current token
            String originalToken = getTokenFromPrefs();
            Log.d(TAG, "Token before deletion: " + originalToken);

            // Resets Instance ID and revokes all tokens.
            FirebaseInstanceId.getInstance().deleteInstanceId();

            // Clear current saved token
            saveTokenToPrefs("");

            // Check for success of empty token
            String tokenCheck = getTokenFromPrefs();
            Log.d(TAG, "Token deleted. Proof: " + tokenCheck);

            // Now manually call onTokenRefresh()
            Log.d(TAG, "Getting new token");
            FirebaseInstanceId.getInstance().getToken();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private void saveTokenToPrefs(String _token)
    {
        // Access Shared Preferences
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();

        // Save to SharedPreferences
        editor.putString("registration_id", _token);
        editor.apply();
    }

    private String getTokenFromPrefs()
    {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        return preferences.getString("registration_id", null);
    }
}

编辑

FirebaseInstanceIdService

public class FirebaseInstanceIdService extends Service

This class is deprecated. In favour of overriding onNewToken in FirebaseMessagingService. Once that has been implemented, this service can be safely removed.

onTokenRefresh() 为 deprecated .在 MyFirebaseMessagingService

中使用 onNewToken()
public class MyFirebaseMessagingService extends FirebaseMessagingService {

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Log.e("NEW_TOKEN",s);
    }

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    }
} 

关于android - Firebase FCM 强制 onTokenRefresh() 被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37454501/

相关文章:

Android Studio-程序类型已经存在 : com. google.android.gms.internal.measurement.zzwp

android - 如何使用同一应用程序将通知从一个用户发送到另一个用户

android - 以编程方式扫描和编辑 Android 应用程序内存值

java - 重新打开 Android 应用程序时 SQLite 表为空

java - 如何在android中创建增量二进制字符串

javascript - 从服务 Javascript 接收变量 - React Hooks

java - Firebase - 尝试将每个用户的数据检索到列表中

java - Firebase Admin SDK (Java) 需要哪些库?

android - 可以在一个 Android 应用程序中使用两个不同的 Firebase 项目,特别是 crashlytics、消息传递和性能扩展

ios - 如果用户当前的 FCM token 不再有效,我该如何更新用户的 FCM token ?