假设我有一个LoginActivity
用户可以使用现有凭据注册或登录的地方。我不想FirebaseInstanceIdService
生成令牌,除非用户已登录并且MainActivity
应用程序已启动。
谢谢
假设我有一个LoginActivity
用户可以使用现有凭据注册或登录的地方。我不想FirebaseInstanceIdService
生成令牌,除非用户已登录并且MainActivity
应用程序已启动。
谢谢
在用户登录之前,您不能阻止FirebaseInstanceIdService.onTokenRefresh()
被呼叫。
你可以在你的用例中做的是:
FirebaseInstanceIdService.onTokenRefresh()
用户未登录,则忽略该事件FirebaseInstanceId.getToken()
并手动!= null
调用(或直接调用您的逻辑)时。onTokenRefresh()
通过这种方式,您可以在用户登录时处理令牌,如果令牌不可用(或被轮换),您将在onTokenRefresh()
稍后收到事件。
更新(2017 年 7 月 3 日):在评论中,一位读者提醒说,FirebaseInstanceIdService.onTokenRefresh()
可以在用户登录后调用。
这是对的。当用户登录时,如果之前没有被调用,getToken()
仍然可以返回。null
onTokenRefresh()
您需要在您的应用程序中处理这种情况。用户很可能仍然可以使用该应用程序,但在收到令牌之前您无法发送推送通知。
当onTokenRefresh()
最终调用时,如果用户之前登录,则可以将令牌关联到用户。
抱歉,这是不可能的。FirebaseInstanceIdService
在应用程序启动时自动调用并生成一个Token
. 请记住,它与应用程序有关Instance
。不是针对某个特定用户。如果您尝试Token
与一个特定用户一起保存(即,当用户登录时,您将token
在服务器数据库中保存该用户的推送通知)。如果您这样做,您将来将面临的错误是,如果两个用户共享一个应用程序Instance
然后推送通知可能会被推送给错误的用户.. 希望你明白我的意思。
我在共享首选项中维护一个标志,指示 gcm 令牌是否发送到服务器。每次我调用一种方法 sendDevicetokenToServer 时,在启动画面中。此方法检查用户 id 是否不为空并且 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);
}