好的,我有一个应用程序,它首先带你浏览几张欢迎幻灯片,然后带你去登录/注册页面,然后转到MainActivity。
我刚刚实现了FCM,服务在之前生成了一个token ,用户已经看到了其中的任何一个页面。如何才能使服务在之后运行,然后到达MainActivity
问题是,一旦令牌刷新到适当的用户帐户,我就会尝试将它发送给MySQL DB,但是由于用户还没有登录,也就是说null和服务器消息都失败了。设计这个的好方法是什么?我想将令牌保存在SharedPreferences中,并在用户登录后发送到服务器,但是当令牌在稍后的某个时候刷新时,会造成许多复杂的问题吗?!
可能的解决方案:
我不确定我是否完全理解这两个服务是如何运行的,但是在onTokenRefresh中,我只是将令牌保存到SharedPreferences中,在MainActivity中,我从SP获得值,然后将它发送到服务器。在这种情况下,当令牌被刷新时,新值将立即再次进入SharedPreferences。但我仍然需要检查它是否是SP中的一个新值,然后将其重新上传到服务器。这太让人困惑了!
发布于 2016-07-13 06:57:43
是的FCM令牌是自动生成的。但是试着从不同的角度来看待这个问题。
我就是这样处理的。
让FCM在应用程序一开始就生成令牌。将调用OnTokenRefresh,您只需将其保存在首选项中,如下所示:
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
sendRegistrationToServer(refreshedToken);
}
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
SharedPreferenceUtils.getInstance(this).setValue(getString(R.string.firebase_cloud_messaging_token), token);
// To implement: Only if user is registered, i.e. UserId is available in preference, update token on server.
int userId = SharedPreferenceUtils.getInstance(this).getIntValue(getString(R.string.user_id), 0);
if(userId != 0){
// Implement code to update registration token to server
}
}希望你的道路畅通。问问你是否需要更多的许可。
编辑
使用新的Firebase (21.0.0),您需要重写onNewToken()方法而不是onTokenRefresh()
@Override
public void onNewToken(@NonNull String s) {
super.onNewToken(s);
sendRegistrationToServer(s);
}发布于 2016-07-13 16:03:44
请注意,您始终可以通过以下方式检索令牌:
FirebaseInstanceID.getInstance().getToken();如果令牌尚未生成,则返回null;如果生成令牌,则返回令牌。在您的示例中,令牌很可能在用户登录时生成。因此,您应该能够将它发送到您的应用服务器,一旦用户已登录。如果它不可用,那么您将在onTokenRefresh回调中发送它,就像Chintan提到的那样。
编辑
使用新的Firebase SDK (21.0.0),您将以这样的方式获得令牌:
FirebaseInstallations.getInstance().getToken(false).addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
@Override
public void onComplete(@NonNull Task<InstallationTokenResult> task) {
if(!task.isSuccessful()){
return;
}
// Get new Instance ID token
String token = task.getResult().getToken();
}
});您最好添加一个侦听器,以便更多地处理响应。
发布于 2016-07-13 09:24:04
我们是这样处理的:
在令牌刷新的情况下,我们更新令牌字符串并将布尔值设置为false。稍后,每当用户登录时,我们每次检查布尔值(更新),如果这是假的-我们附加当前令牌到他的id,并发送到服务器,并设置更新为真。
https://stackoverflow.com/questions/38340526
复制相似问题