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,
You might want to take a look at the GCM response format documentation: https://developer.android.com/google/gcm/gcm.html#response
Specifically this part:
results
Array of objects representing the status of the messages processed. The objects are listed in the same order as the request (i.e., for each registration ID in the request, its result is listed in the same index in the response) and they can have these fields:
message_id: String representing the message when it was successfully processed.
registration_id: If set, means that GCM processed the message but it has another canonical registration ID for that device, so sender should replace the IDs on future requests (otherwise they might be rejected). This field is never set if there is an error in the request.
error: String describing an error that occurred while processing the message for that recipient. The possible values are the same as documented in the above table, plus "Unavailable" (meaning GCM servers were busy and could not process the message for that particular recipient, so it could be retried).
And this part:
If registration_id is set, replace the original ID with the new value (canonical ID) in your server database. Note that the original ID is not part of the result, so you need to obtain it from the list of registration_ids passed in the request (using the same index).
So the registration ID that you need to update is located at the same index (in the registration ID array you created for the message) as the canonical ID you found.
For Case 1: from the docs:
GCM provides a facility called "canonical registration IDs" to easily recover from these situations. A canonical registration ID is defined to be the ID of the last registration requested by your application. This is the ID that the server should use when sending messages to the device.
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.