I’m creating an app which uses Facebook and GCM. A user can use the app on multiple devices, a friend can send him GCM messages using his facebook id.
On my server, I have a table which maps the facebook id to a gcm id. The table does not require the facebook id to be unique, so messages can be sent to multiple devices.
In the docs, it demonstrates the following way to handle errors when sending a message:
if (result.getMessageId() != null) {
String canonicalRegId = result.getCanonicalRegistrationId();
if (canonicalRegId != null) {
//CASE 1
// same device has more than on registration ID: update database
}
} else {
String error = result.getErrorCodeName();
if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
// CASE 2
// application has been removed from device - unregister database
}
}
In CASE 1, it says to replace a registration id with the canonical registration id. But how do I know what registration id to replace? Say the receiver has 2 devices, I have 2 registration ids to choose from, but no idea which one I should pick.
In CASE 2, a same problem occurs. How do I know which registration id to remove from the database?
EDIT
For clarity, this is the code I’m using at the moment:
List<String> gcmIds = getGCMIds(c, fbId);
if (gcmIds != null && !gcmIds.isEmpty()) {
Sender sender = new Sender(Params.GOOGLE_API_KEY);
Message message = new Message.Builder().addData("message", apiMessage.buildJSONString()).build();
MulticastResult result = sender.send(message, gcmIds, 5);
List<Result> results = result.getResults();
/* Do something with the results */
success = result.getFailure() == 0;
} else {
success = false;
}
For Case 1: from the docs:
When sending a message to a list of devices, the list of results will be in the same order. So, you can actually just look up the regID used at the same index as in the results, and replace that registrationID in your dataStore. Remember to keep the canonical ID, as that’s the most recently registered one.
For Case 2:
Similarly, delete the regID that was at the same index.
For a full sample implementation, take a look at the official demo code for a send call similar to the one you’re implementing.