gpt4 book ai didi

java - GoogleCloudMessaging API中注册ID更新或过期如何处理?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:37:59 26 4
gpt4 key购买 nike

正如问题所说,如何找出 registration ID 何时执行?已在 GoogleCloudMessaging 中失效应用程序接口(interface)?我已经阅读了关于类似主题的几个问题的答案:Do GCM registration id's expire?Google Coud Mesaging (GCM) and registration_id expiry, how will I know? .这些问题的问题在于,C2DM 或使用 GCMRegistrar 的旧 GCM API 的答案而不是 GoogleCloudMessaging API。前两种方法已被贬值。

我将尝试逐步打破我的困惑/问题:

1)Enable GCM 标题下, 在第二点它说:

Google 可能会定期刷新注册 ID,因此您在设计 Android 应用程序时应了解 com.google.android.c2dm.intent.REGISTRATION Intent 可能会被多次调用。您的 Android 应用程序需要能够做出相应的响应。

注册 ID 一直有效,直到 Android 应用程序明确注销自身,或者直到 Google 为您的 Android 应用程序刷新注册 ID。每当应用程序收到带有 registration_id extra 的 com.google.android.c2dm.intent.REGISTRATION Intent 时,它应该保存 ID 以供将来使用,将其传递给 3rd 方服务器以完成注册,并跟踪是否服务器完成注册。如果服务器未能完成注册,则应重试或从 GCM 中注销。

2) 现在,如果是这种情况,那么我应该在 BroadcastReceiver 中处理 Intent 并发送 register()再次请求以获取新的注册 ID。但问题是在同一页标题下 ERROR_MAIN_THREAD ,它说:GCM 方法是阻塞的。您不应在主线程或广播接收器中运行它们

3) 我还了解到当注册 ID 更改时还有其他两种情况(如标题 Keeping the Registration State in Sync 下的高级主题所述):应用程序更新和备份与恢复。我已经在打开应用程序时处理它们。

4) 在 GCMRegistrar API 中,GCMBaseIntentService 内, 曾经有一个回调 onRegistered()方法,在设备注册时调用。在这里,我曾经保留注册 ID 并发送到 3rd 方服务器。

但是,现在我应该如何处理注册 ID 的更新或续订,持久化并将其发送到 3rd 方服务器?

可能是我读完所有内容后感到困惑,或者我遗漏了什么。非常感谢您的帮助。

更新

即使在 Handling registration ID changes in Google Cloud Messaging on Android线程,没有提到如何处理Google定期刷新ID?

最佳答案

我正在提供一种方法作为我在我的应用程序中实现的方法

@Override
protected void onRegistered(Context context, String registrationId) {
Log.i(TAG, "Device registered: regId = " + registrationId);
//displayMessage(context, getString(R.string.gcm_registered));
//ServerUtilities.register(context, registrationId);
//1. Store this id to application Prefs on each request of device registration
//2. Clear this id from app prefs on each request of device un-registration
//3. Now add an if check for new registartion id to server, you can write a method on server side to check if this reg-id matching for this device or not (and you need an unique identification of device to be stored on server)
//4. That method will clear that if id is matching it meanse this is existing reg-id, and if not matching this is updated reg-id.
//5. If this is updated reg-id, update on server and update into application prefs.
}

你也可以这样做

if reg_id exists_into prefrences then
if stored_id equals_to new_reg_id then
do nothing
else
say server to reg_id updated
update prefrences with new id
end if
else
update this id to application prefs
say server that your device is registered
end if

但是当用户清除应用程序数据时就会出现问题,您将丢失当前的注册 ID。


Update for new API example Credits goes to Eran and His Answer Handling registration ID changes in Google Cloud Messaging on Android

Google 更改了他们的 Demo App使用新界面。他们通过为应用程序在本地保存的值设置到期日期来刷新注册 ID。当应用程序启动时,他们会加载本地存储的注册 ID。如果它“已过期”(在演示中意味着它是 7 天前从 GCM 收到的),他们会再次调用 gcm.register(senderID)

这不会处理 Google 为长时间未启动的应用刷新注册 ID 的假设情况。在这种情况下,应用程序不会知道更改,第 3 方服务器也不会。

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.main);
mDisplay = (TextView) findViewById(R.id.display);

context = getApplicationContext();
regid = getRegistrationId(context);

if (regid.length() == 0) {
registerBackground();
}
gcm = GoogleCloudMessaging.getInstance(this);
}

/**
* Gets the current registration id for application on GCM service.
* <p>
* If result is empty, the registration has failed.
*
* @return registration id, or empty string if the registration is not
* complete.
*/
private String getRegistrationId(Context context) {
final SharedPreferences prefs = getGCMPreferences(context);
String registrationId = prefs.getString(PROPERTY_REG_ID, "");
if (registrationId.length() == 0) {
Log.v(TAG, "Registration not found.");
return "";
}
// check if app was updated; if so, it must clear registration id to
// avoid a race condition if GCM sends a message
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion || isRegistrationExpired()) {
Log.v(TAG, "App version changed or registration expired.");
return "";
}
return registrationId;
}

/**
* Checks if the registration has expired.
*
* <p>To avoid the scenario where the device sends the registration to the
* server but the server loses it, the app developer may choose to re-register
* after REGISTRATION_EXPIRY_TIME_MS.
*
* @return true if the registration has expired.
*/
private boolean isRegistrationExpired() {
final SharedPreferences prefs = getGCMPreferences(context);
// checks if the information is not stale
long expirationTime =
prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1);
return System.currentTimeMillis() > expirationTime;
}

关于java - GoogleCloudMessaging API中注册ID更新或过期如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17335572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com