我正在开发一个 android 应用程序,并在其上实现推送通知功能。
我将所有用户令牌保存在我的服务器上,以便在需要时向他们发送通知。
但是,我需要一些关于如何(或更准确地说是何时)将令牌从应用程序发送到我的服务器以保存它的帮助。
目前,在应用程序第一次启动时,应用程序会请求令牌,然后将令牌与 UDID 一起发送到我的服务器。但是,由于我的实现,应用程序第一次启动令牌时尚未检索到,因此将一个空字符串发送到我的服务器!当然,第二次和令牌正常发送。(每次应用程序启动时,我都会将 udid 和令牌注册到我的服务器)
代码看起来像这样:
//registering for push
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
Log.i("****************","I just Registered!!");
} else {
Log.i("****************","Already registered");
}
final String android_id = Secure.getString(this.getContentResolver(),Secure.ANDROID_ID);
String jsonString = "{\"deviceUUID\":\"" + android_id + "\",\"os\":\"android\", \"pushToken\":\"" + GCMRegistrar.getRegistrationId(this) + "\"}";
. . . Sending the jsonString to my server . . .
正如您第一次看到的GCMRegistrar.getRegistrationId(this)
那样,因为检索新令牌的调用是异步的,并且发生在我将数据发送到我的服务器之后,所以它是 null。
下次应用程序启动时,令牌将正常发送,但需要修复。
一种想法是始终注册 token :
//registering for push
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
GCMRegistrar.register(this, SENDER_ID);
并在GCMIntentServiceprotected void onRegistered(Context context, String regId)
类的函数内部将令牌发送到我的服务器。这样,令牌将始终在我发送之前被检索,并确保第一次永远不会为空。
实际上,这正是 iOS 应用程序中的工作方式。通常,您在检索它的函数内将令牌发送到您的服务器,以便在您尝试发送它之前确定它实际上会在那里。
这种方法正确吗?你怎么看?