Jonatan
Jonatan

Reputation: 3992

Implementation of GCM app server with multiple devices per user

I'm a bit confused about how to manage registration ids for all app installations.

In the app server database I have a User table and a UserDevice table. Every User may have many UserDevices. Each UserDevice have a registration id. So when a user should be notified I send the message to all the registration id's for all the devices of the user.

But when the application is reinstalled, Android is updated or something else happens that causes the registration id to change, the app will send a new registration id to our app server. But I have no way to know if this is a new device or if an existing UserDevice should be updated with the new registration id.

How is this supposed to be handled? My first thought is to send a persistent hardware ID as well as the registration ID, but perhaps there is a better way?

Upvotes: 2

Views: 168

Answers (3)

Sam Stern
Sam Stern

Reputation: 25134

You could take a look at GCM's Device Group feature, which is explicitly intended for the "one user, many devices" problem: https://developers.google.com/cloud-messaging/notifications

Upvotes: 1

Rob85
Rob85

Reputation: 1729

You don't have to worry about this. If the user does reinstall the app and the token is refreshed just add it to the users list of tokens (keeping the old one for now).

next time you send a notification to this user it will fail on the token that is no longer used. Now all you have to do when you get the fail reply from google is remove that token from your devices table.

Remember if you fail to send to a token for reasons such as invalidRegID or NotRegistered then the GCM will/has unregistered that token so it is no good so it needs to be removed from your list otherwise you will get in googles bad books for repeatedly sending to the same failed token. So remove ones that fail.

when my apps start i always check to see if the device is registered if it is I send the same token to my app server just incase it somehow got deleted.

Hope this helps

Upvotes: 1

erik
erik

Reputation: 549

I use PushSharp and there I can use the different event handlers that are defined to handle subscription changes or expirations. The source code is available on github https://github.com/Redth/PushSharp/blob/master/PushSharp.Android/Gcm/GcmPushChannel.cs You can probably apply the same logic to your application.

Upvotes: 0

Related Questions