GCM - 不清楚应用更新的工作原理?

时间:2012-07-09 18:48:21

标签: android google-cloud-messaging

我正在看GCM,我不确定在应用程序更新的情况下我们需要做什么。医生说:

“当应用程序更新时,它应该使其现有的注册ID无效,因为它不能保证与新版本一起使用。因为在更新应用程序时没有调用生命周期方法,所以实现此验证的最佳方法当存储注册ID时,存储当前的应用程序版本。然后当应用程序启动时,将存储的值与当前的应用程序版本进行比较。如果它们不匹配,则使存储的数据无效并再次开始注册过程。“< / p>

那应该是什么样子?类似的东西:

public class MyActivity extends Activity {

    @Override
    public void onCreate(...) {
        if (we are a new app version) {
            // calling register() force-starts the process of getting a new 
            // gcm token?
            GCMRegistrar.register(context, SENDER_ID);

            saveLastVersionUpdateCodeToDisk();
        }
    }

所以我们需要确保自己再次调用GCMRegistrar.register(),以防我们成为新的应用版本?

由于

3 个答案:

答案 0 :(得分:1)

是的,您应该再次致电GCMRegistrar.register,并在广播接收器中确保使用新ID更新您的服务器。

答案 1 :(得分:1)

这个问题相当陈旧,但这是我在帮助程序类源代码中为GCMRegistrar.getRegistrationId(Context context)找到的代码。

简短回答:GCM代码会检查应用是否已更新。只要您调用此方法并调用此方法的返回值为空白,就不必担心它。

public static String getRegistrationId(Context context) {
    final SharedPreferences prefs = getGCMPreferences(context);
    String registrationId = prefs.getString(PROPERTY_REG_ID, "");
    // check if app was updated; if so, it must clear registration id to
    // avoid a race condition if GCM sends a message
    int oldVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
    int newVersion = getAppVersion(context);
    if (oldVersion != Integer.MIN_VALUE && oldVersion != newVersion) {
        Log.v(TAG, "App version changed from " + oldVersion + " to " +
                newVersion + "; resetting registration id");
        clearRegistrationId(context);
        registrationId = "";
    }
    return registrationId;
}

答案 2 :(得分:0)

关于官方文件&#39;例如,应检查是否在当前应用版本中创建了注册ID。如果app已在旧版本中注册,则必须再次注册。

http://developer.android.com/google/gcm/client.html

请注意,如果更新了应用,则注册ID将返回为空,因此将再次注册应用:

if (checkPlayServices()) {
    gcm = GoogleCloudMessaging.getInstance(this);
    regid = getRegistrationId(context);

    if (regid.isEmpty()) {
        registerInBackground();
    }
} else {
    Log.i(TAG, "No valid Google Play Services APK found.");
}

private String getRegistrationId(Context context) {
    final SharedPreferences prefs = getGCMPreferences(context);
    String registrationId = prefs.getString(PROPERTY_REG_ID, "");
    if (registrationId.isEmpty()) {
        Log.i(TAG, "Registration not found.");
        return "";
    }
    // Check if app was updated; if so, it must clear the registration ID
    // since the existing regID is not guaranteed to work with the new
    // app version.
    int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
    int currentVersion = getAppVersion(context);
    if (registeredVersion != currentVersion) {
        Log.i(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}