1

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

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

那应该是什么样子?就像是:

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() 以防我们是新的应用程序版本?

谢谢

4

3 回答 3

1

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

简短回答:GCM 代码检查应用程序是否已更新。只要你调用这个方法,如果这个方法的返回值为空的话,调用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;
}
于 2013-04-05T16:17:05.260 回答
1

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

于 2012-07-09T19:08:40.583 回答
0

关于官方文档的例子,应该检查当前应用版本是否创建了注册ID。如果应用程序使用旧版本注册,则必须重新注册。

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;
}
于 2014-05-22T17:26:49.347 回答