根据
docs InstanceId:
provides a unique identifier for each app instance
如果出现以下情况,则实例ID是稳定的,但可能会失效:
- App deletes Instance ID
- Device is factory reset
- User uninstalls the app
- User clears app data
但是,根据我的测试,即使应用程序仅从最近一次刷过,以下调用似乎也会返回不同的ID.
InstanceID.getInstance(context).getID();
这是Google Play服务中的错误还是我使用它的错误?
最佳答案 2 tymm答案:来自客户端库实例ID代码:
boolean needRefreshToken() {
String appVersion = sSharedPreferencesHelper.get("appVersion");
if (appVersion == null) {
return true;
}
if (!appVersion.equals(sCurrentAppVersion)) {
return true;
}
String lastTokenAcquiringTime = sSharedPreferencesHelper.get("lastToken");
if (lastTokenAcquiringTime == null) {
return true;
}
Long l = Long.parseLong(lastTokenAcquiringTime);
if (System.currentTimeMillis() / 1000 - l <= 3600*24*7) {
return false;
}
return true;
}
关于直接问题:每个实例ID都由存储在名为“com.google.android.gms.appid”的应用首选项中的密钥对支持; InstanceID.getInstance(context).getID()以Base64格式返回公钥的SHA-1摘要.因此,请尝试调查为什么无法从首选项恢复KeyPair;)
库代码(com.google.android.gms.iid.zzd.class)中存在错误:
KeyPair zzdj(String subtype) {
String string2 = this.get(subtype, "|P|");
String string3 = this.get(subtype, "|K|");
...
应该:
KeyPair zzdj(String subtype) {
String string2 = this.get(subtype + "|P|");
String string3 = this.get(subtype + "|K|");
...
所以,请在getToken(…)命令之后从注册令牌(它的第一部分直到冒号)中获取此IID.因为getID()仅初始化将用于下一个服务器请求的“promise”KeyPair,以防您的应用程序被强制从任务栏停止,从而导致完全卸载静态变量.
这是热门修复(请在调用getId()之前将其设置为:)
public void fixPreferencesKeysId() {
SharedPreferences sh = getSharedPreferences("com.google.android.gms.appid", MODE_PRIVATE);
String privk = sh.getString("|K|", null);
if (privk != null) {
sh.edit().remove("|K|").putString("|S||K|", privk).commit();
}
String pubk = sh.getString("|P|", null);
if (pubk != null) {
sh.edit().remove("|P|").putString("|S||P|", pubk).commit();
}
}