假设我有LoginActivity
,用户可以使用现有凭据注册或登录。除非用户已登录并且已启动应用程序的FirebaseInstanceIdService
,否则我不希望MainActivity
生成令牌。
谢谢
答案 0 :(得分:16)
在用户登录之前,您无法阻止FirebaseInstanceIdService.onTokenRefresh()
被阻止。
您在用例中可以做的是:
FirebaseInstanceIdService.onTokenRefresh()
忽略该事件FirebaseInstanceId.getToken()
以及!= null
是否手动调用onTokenRefresh()
(或直接调用您的逻辑)。通过这种方式,您可以在用户登录时处理令牌,如果令牌不可用(或已轮换),您将在稍后收到onTokenRefresh()
事件。
更新(2017年7月3日):在评论中,读者提醒用户登录后可以调用FirebaseInstanceIdService.onTokenRefresh()
。
这是对的。当用户登录时,如果之前未调用getToken()
,则null
仍可返回onTokenRefresh()
。
您需要在自己的应用中使用此案例。最有可能的是,用户无论如何都可以使用该应用,但在收到令牌之前,您无法发送推送通知。
最后调用onTokenRefresh()
时,如果用户之前登录,则可以将该令牌与用户关联。
答案 1 :(得分:3)
抱歉,但这是不可能的。 FirebaseInstanceIdService
会在应用程序启动时自动调用并生成Token
。请记住,它与应用程序Instance
有关。不是与一个特定的用户。如果您尝试使用一个特定用户保存Token
(即,当用户登录时,您将在服务器数据库中保存token
以获取该用户的推送通知)。如果您这样做是一个错误,未来将面临的是,如果两个用户共享一个应用程序Instance
,那么推送通知可能会被推送给错误的用户..
希望你明白我的观点。
答案 2 :(得分:0)
我在共享pref中维护一个标志,指示gcm令牌是否发送到服务器。每次我调用一个方法sendDevicetokenToServer时,在Splash屏幕中。此方法检查用户标识是否为空并且gcm发送状态,然后将令牌发送到服务器。
public static void sendRegistrationToServer(final Context context) {
if(Common.getBooleanPerf(context,Constants.isTokenSentToServer,false) ||
Common.getStringPref(context,Constants.userId,"").isEmpty()){
return;
}
String token = FirebaseInstanceId.getInstance().getToken();
String userId = Common.getUserId(context);
if(!userId.isEmpty()) {
HashMap<String, Object> reqJson = new HashMap<>();
reqJson.put("deviceToken", token);
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<JsonElement> call = apiService.updateDeviceToken(reqJson,Common.getUserId(context),Common.getAccessToken(context));
call.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(Call<JsonElement> call, Response<JsonElement> serverResponse) {
try {
JsonElement jsonElement = serverResponse.body();
JSONObject response = new JSONObject(jsonElement.toString());
if(context == null ){
return;
}
if(response.getString(Constants.statusCode).equalsIgnoreCase(Constants.responseStatusSuccess)) {
Common.saveBooleanPref(context,Constants.isTokenSentToServer,true);
}
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void onFailure(Call<JsonElement> call, Throwable throwable) {
Log.d("", "RetroFit2.0 :getAppVersion: " + "eroorrrrrrrrrrrr");
Log.e("eroooooooorr", throwable.toString());
}
});
}
}
在MyFirebaseInstanceIDService类
中 @Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
Common.saveBooleanPref(this,Constants.isTokenSentToServer,false);
Common.sendRegistrationToServer(this);
}