GCM get invalid tokens when sending to multiple devices at once

765 views Asked by At

I'm trying to remove invalid GCM Tokens from my database after they failed in a broadcast request.

I send it via:

payload = {
            "registration_ids": gcm_keys,
            "data": messageData
        }
headers = {
    'Content-type': 'application/json',
    'Authorization': Message_Broker.api_key
}

try:
    return requests.post(Message_Broker.host, data=json.dumps(payload), headers=headers)

Lets say I try to send a message to:

gcm_keys = ['daöodaeöoijiö','12345','fwiorjpfwj'] # Lets pretend the second one is a valid token

From the content of the response object I get a dict like this:

response_results = [{u'error': u'InvalidRegistration'}, {u'registration_id': u'1234567', u'message_id': u'0:14339323424213768%540eeb39f9fd7aed'}, {u'error': u'InvalidRegistration'}]

To find out which tokens failed I made a set substraction with a list comprehension:

failed_keys = list(set(gcm_keys) - set([r.get('registration_id') for r in response_results]))

This should give me back only the tokens which produced an error.

My first question is, is there a more common way to do so or any kind of best practice?

Second question is, as you can see in the response_results and the gcm_keys, the valid token is not returned. Instead a kinda similar token is given back. I did not find any on this. Why do I get a different token back?

-> Just found out that in case I get a different token back, I should replace the old one. That leads to another question. When I send to several tokens, how can I find out to which gcm token in the request this returned token belongs? Is the order in the results always the same as in the request?

1

There are 1 answers

0
Koh On

The response body's results parameter should have an array of objects that are listed in the same order as the request. Please refer here.