Séquence appropriée pour get un jeton d'logging pour la notification push GCM sur iOS? Le GCM n'est-il pas fiable?

Bonjour, j'ai suivi le tutoriel pour utiliser GCM sur iOS. Cela a fonctionné par intermittence (ce qui signifie que tous les certificates, permissions et autres choses vont bien). Cependant, dernièrement, j'ai reçu les deux messages d'erreur à plusieurs resockets:

GCM | GCM registration is not ready with auth credentials GCM | GCM registration is not ready with auth credentials .

En outre, la reconnection à GCM échoue avec:

Error Domain=com.google.gcm Code=501 "(null)"

Ceci est en partie lié au fait que l'appareil ne reçoit pas d'identifiant d'logging GCM. Quelqu'un d'autre a-t-il rencontré ces problèmes plus souvent ces derniers time? Ou est-ce parce que j'appelle l'API GCM dans une séquence incorrecte (en particulier les connectWithHandler: startWithConfig: et tokenWithAuthorizedEntity )? Je soupçonne que la raison est la dernière puisque je reçois un ID GCM après un certain retard.

Je ne reçois pas toujours un identifiant GCM non plus. Quand je n'en reçois pas, je dois généralement lancer l'application une ou deux fois de plus via Xcode. (Ou en fermant l'application de force). Clairement, ce n'est pas quelque chose que mes users devraient faire.

Voici la séquence de mes appels API GCM:

  1. L'appareil reçoit un jeton APNS
  2. J'appelle ensuite tokenWithAuthorizedEntity: en utilisant mon jeton APNS
  3. Cela entraîne généralement l'une de ces deux erreurs mentionnées ci-dessus.
  4. Chaque fois que j'ai réellement besoin d'un jeton GCM, je force une nouvelle extraction du jeton GCM en appelant à nouveau tokenWithAuthorizedEntity .

Aussi, j'ai l'appel de connectWithHandler: écrit dans ma méthode applicationDidBecomeActive: aussi.

Quelques questions:

  1. L'appel à connectWithHandler: dans applicationDidBecomeActive: nécessaire si je ne souhaite recevoir que des messages push GCM et ne pas les envoyer en amont?
  2. Si la réponse à (1) est oui, dans le gestionnaire d'achèvement de cette méthode, si une erreur survient, et que je n'ai pas le jeton GCM à ce moment-là, devrais-je essayer d'get à nouveau un jeton? (appelez tokenWithAuthorizedEntity ?)
  3. Quand startWithConfig doit- startWithConfig être appelé? Avant d'get un jeton GCM ou après?

EDIT: Des tests limités ont révélé que les éléments suivants semblent fonctionner:

  1. Obtenez d'abord l'ID GGLInstance (appelez getIDWithHandler:
  2. Si l'ID GGLInstance ci-dessus a été reçu sans erreur, requestz un jeton GCM (appelez tokenWithAuthorizedEntity:
  3. Faire cela donne généralement l'erreur suivante, mais au less dans un court laps de time (~ 3-10 secondes), le jeton est reçu:

Impossible de find le jeton dans le cache. Error Domain = com.google.iid Code = -25300 "(null)"

L'appel à connectWithHandler est-il: dans applicationDidBecomeActive: nécessaire si je ne souhaite recevoir que des messages push GCM et ne pas les envoyer en amont?

Oui, connectWithHandler est nécessaire, quel que soit son but principal: établir une connection avec le sharepoint terminaison GCM.

Si la réponse à (1) est oui, dans le gestionnaire d'achèvement de cette méthode, si une erreur se produit, et que je n'ai pas le jeton GCM à ce moment-là, devrais-je essayer d'get à nouveau un jeton? (appelez tokenWithAuthorizedEntity?)

Donc, la façon dont cela devrait fonctionner est de vérifier les erreurs pendant que vous requestz le jeton lui-même et de réessayer avec un return exponentiel si la requête échoue. Plus d'infos ici . Aussi, lisez la note ici . Maintenant, si vous voulez toujours ré-invoquer le GGLInstanceIDTokenHandler à tout moment, vous devez également implémenter deleteTokenWithAuthorizedEntity avant d'get un nouveau jeton.

Quand startWithConfig doit-il être appelé? Avant d'get un jeton GCM ou après?

Dans votre AppDelegate.m vous devez appeler l' GGLInstanceID partagée startWithConfig aide de la méthode startWithConfig . Essentiellement dans la class GGLINstanceID.h , il faut d'abord get un ID d'instance; autorisez ensuite le projet en tant qu'entité autorisée et obtenez un jeton d'logging via le service iid. Voir l'implémentation détaillée de la class GGLInstanceID.h ici .

J'espère que cela répond à l'aide!

MODIFIER

Est- ce que cela répond à votre question? En gros, assurez-vous que l'identificateur de regroupement pour votre cible est le même que le BUNDLE_ID dans le file info.plist.

Espérons que cela résout l'erreur, sinon postr ce qui s'est passé quand vous l'avez testé et nous pouvons partir de là. 🙂

Essayez de déplacer le bloc connectWithHandler vers la méthode didFinishLaunchingWithOptions, après avoir obtenu le bloc gcmConfig (pour l'exemple officiel, après le [END start_gcm_service])