InstanceId#getId()没有返回稳定的Id

时间:2015-07-08 13:26:04

标签: android google-play-services

根据docs InstanceId:

  

为每个应用实例提供唯一标识符

并且实例ID是稳定的,但如果符合以下条件,则可能无效:

  
      
  • 应用删除实例ID
  •   
  • 设备已恢复出厂设置
  •   
  • 用户卸载应用
  •   
  • 用户清除应用数据
  •   

但是,根据我的测试,即使应用程序只是从最近一次刷过,以下调用似乎也会返回不同的ID。

InstanceID.getInstance(context).getID();

这是Google Play服务中的错误还是我使用它错误?

2 个答案:

答案 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令牌在这方面不稳定,因为它可能会在一段时间后过期,您需要检查它。