android – InstanceId #getId()不返回稳定的Id

根据
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();            
    }
}
点赞