我正在开发一个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)
为空,因为检索新令牌的调用是 asychronous ,并且在我将数据发送到服务器后发生。
下次启动应用程序时,令牌将正常发送,但需要修复。
一个想法是始终注册令牌:
//registering for push
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
GCMRegistrar.register(this, SENDER_ID);
并在 GCMIntentService 类的protected void onRegistered(Context context, String regId)
函数内部将令牌发送到我的服务器。这样,在发送之前总是会检索令牌,并且确保第一次永远不会为空。
实际上,这正是iOS应用程序中的完成方式。通常你会在检索它的函数内部将令牌发送到你的服务器,这样你就可以确定它在你尝试发送之前确实存在了。
这种做法是否正确?你觉得怎么样?
答案 0 :(得分:1)
如果您使用的是GCM库,则应在服务器
中注册令牌protected void onRegistered(Context context, String registrationId)
如果您没有使用库,那么您将在GCMIntentService
中执行类似的操作@Override
public final void onHandleIntent(Intent intent) {
try {
String action = intent.getAction();
if (action.equals("com.google.android.c2dm.intent.REGISTRATION")) {
handleRegistration(intent);
} else if(action.equals("com.google.android.c2dm.intent.RECEIVE")){
handleMessage(intent);
}
} finally {
synchronized (LOCK) {
sWakeLock.release();
}
}
}
其中handleRegistration()
是将令牌发送到服务器的函数。
当您向服务器发送令牌并成功注册时,您可以使用
GCMRegistrar.setRegisteredOnServer(context, true);
然后,您可以使用
了解令牌是否已在服务器中注册GCMRegistrar.isRegisteredOnServer(context);
答案 1 :(得分:0)
当你在GCMIntentService
时,你已经在UI线程的一个单独的线程上了。我会说接近你的服务器是个好点。
您应该想到的一件事是如何使其安全失败。当来自GCM的呼叫返回注册密钥但您对服务器的api呼叫失败时会发生什么。在这种情况下,我建议至少在下一个应用程序启动时检查您是否有任何注册ID等待发送到服务器,如果是,请发送它们或者只是重新注册到GCM并让程序再次发生。