我正在将我的应用从 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.
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/