根据docs InstanceId:
为每个应用实例提供唯一标识符
并且实例ID是稳定的,但如果符合以下条件,则可能无效:
- 应用删除实例ID
- 设备已恢复出厂设置
- 用户卸载应用
- 用户清除应用数据
但是,根据我的测试,即使应用程序只是从最近一次刷过,以下调用似乎也会返回不同的ID。
InstanceID.getInstance(context).getID();
这是Google Play服务中的错误还是我使用它错误?
答案 0 :(得分:2)
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都由存储在名为&#34; com.google.android.gms.appid&#34;;的应用首选项中的密钥对支持。
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()仅初始化&#34; promise&#34; 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();
}
}
答案 1 :(得分:0)
stable 的含义是,如果没有其中一个事件(应用程序删除实例ID,......),实例ID将不会失效。
例如,GCM令牌在这方面不稳定,因为它可能会在一段时间后过期,您需要检查它。