I'm having a slight issue with device registration management on my client/server for push notifications.
Problem
The problem that I'm having is that when I uninstall the application and re install it the application returns an empty string for the registration id (GCMRegistrar.getRegistrationId(this)
) which I re-register the device with my server. The problem is that I get a new, different registration id (sometimes) and BOTH WORK! So I don't know how server side to know whether it's for the same device. I should also note I'm not changing the application version. Do any changes to the manifest trigger a new registration id to be issued?
On the Android side, I do the following:
/**
* Registers this android device with GCM
*/
private void registerDeviceWithGCM() {
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
log.debug("Registering application with GCM");
GCMRegistrar.register(this, ApplicationData.SENDER_ID);
} else {
log.debug("Already registered: " + regId);
deviceRegistrationService.updateServerRegistrationData(this, regId);
}
}
In my GCMIntentService.java
I do the following:
/**
* Triggered upon new device registration and updates registration info with the server
*
* @param context context received from
* @param regId device's registration id
*/
@Override
protected void onRegistered(Context context, String regId) {
Log.d(TAG, "Registering: " + regId);
Intent intent = new Intent(RegistrationReceiver.REGISTRATION_INTENT);
intent.putExtra(RegistrationReceiver.REGISTRATION_ID, regId);
context.sendBroadcast(intent);
}
In my RegistrationReceiver.java
I have the following:
/**
* Triggers the device registration with cirrus
*
* @param context unused
* @param intent used to get registration id
*/
@Override
public void handleReceive(Context context, Intent intent) {
log.debug("Received registration with intent action: " + intent.getAction());
if (intent.getAction().equals(REGISTRATION_INTENT)) {
String regId = intent.getStringExtra(REGISTRATION_ID);
log.debug("Received registration intent with registration id: " + regId);
deviceRegistrationService.updateServerRegistrationData(loginActivity, regId);
} else if (intent.getAction().equals(REGISTRATION_FAILED_INTENT)) {
log.debug("Received registration failed intent, displaying error message");
showRegistrationFailedMessage(intent);
}
}
Again, the problem here is that I have two ore more registration id's that all work (it wouldn't be a problem if I the old one simply didn't work when trying to post a message from the server as I can simply clean that up).
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…