Firebase FCM 强制 onTokenRefresh() 被调用

新手上路,请多包涵

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

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

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

原文由 TareK Khoury 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 942
2 个回答

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

根据 FirebaseCloudMessaging 指南:

您可以将通知定位到单个特定设备。在您的应用程序首次启动时,FCM SDK 会为客户端应用程序实例生成一个注册令牌。

截屏

来源链接: https ://firebase.google.com/docs/notifications/android/console-device#access_the_registration_token

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

如果您想手动强制 onTokenRefresh() ,您可以创建一个 IntentService 并删除令牌实例。然后,当您调用 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

公共类 FirebaseInstanceIdService 扩展服务

此类已弃用。支持在 FirebaseMessagingService 中覆盖 onNewToken。实施后,可以安全地删除此服务。

onTokenRefresh() 已 弃用。使用 onNewToken()MyFirebaseMessagingService

 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);
    }
}

原文由 Prince 发布,翻译遵循 CC BY-SA 4.0 许可协议

一个简短的回答是,如果您想在 onTokenRefresh() 中执行的操作要求用户登录,则将其全部包含在:

 if (FirebaseAuth.instance.currentUser != null) {
  // All code that requires a logged in user
}

这样,在用户登录之前什么都不会发生,此时该方法将再次触发并且会发生一些事情。 :)

原文由 Karolina Hagegård 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题