在iOS上获取GCM推送通知的注册令牌的正确顺序?GCM不可靠吗?

Ked*_*ape 14 cocoa-touch push-notification ios google-cloud-messaging

嗨,我已经按照教程在iOS上使用GCM.它一直在间歇性地工作(这意味着所有的证书,权限和东西都没问题).但是最近,我一直在反复收到两条错误消息:

GCM | GCM registration is not ready with auth credentials.

此外,重新连接到GCM失败:

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

这部分地与未获得GCM注册ID的设备相关.有没有其他人最近更频繁地遇到这些问题?还是因为我打电话的GCM API不正确的序列(特别是connectWithHandler:,startWithConfig:tokenWithAuthorizedEntity方法)?我怀疑的原因是因为我后面得到一些延迟后,GCM ID.

我也不总是收到GCM ID.当我没有收到一个,我通常需要通过Xcode运行应用程序一次或两次.(或通过强制关闭应用程序).显然,这不是我的用户应该做的事情.

这是我的GCM API调用的序列:

  1. 设备获取APNS令牌
  2. 然后tokenWithAuthorizedEntity:我使用我的APNS令牌进行呼叫
  3. ^这通常会导致上述两个错误之一.
  4. 每当我真正需要GCM令牌时,我会tokenWithAuthorizedEntity再次调用强制重新获取GCM令牌.

另外,我也在connectWithHandler:我的applicationDidBecomeActive:方法中写了调用.

几个问题:

  1. 是调用connectWithHandler:applicationDidBecomeActive:必要的,如果我只接收GCM推送消息感兴趣,不是上游给他们?
  2. 如果对(1)的回答是肯定的,那么在该方法的完成处理程序中,如果发生错误,并且我在那时没有GCM令牌,我是否应该再次尝试获取令牌?(即打电话tokenWithAuthorizedEntity?)
  3. 应该startWithConfig什么时候打电话?在获得GCM令牌之前或之后?

编辑:有限测试显示以下似乎工作:

  1. 首先获取GGLInstance ID(即调用getIDWithHandler:)
  2. 如果收到上述GGLInstance ID且没有任何错误,请求GCM令牌(即通话tokenWithAuthorizedEntity:)
  3. 这样做通常会产生以下错误,但至少在短时间内(~3-10秒),收到令牌:

无法在缓存中找到令牌错误域= com.google.iid代码= -25300"(null)"

小智 4

如果我只对接收 GCM 推送消息而不向上游发送消息感兴趣,那么在 applicationDidBecomeActive: 中调用 connectWithHandler: 是否有必要?

是的,connectWithHandler是必要的,因为它的主要目的是与 GCM 端点建立连接。

如果 (1) 的答案是肯定的,那么在该方法的完成处理程序中,如果发生错误,并且我当时没有 GCM 令牌,我是否应该再次尝试获取令牌?(即调用 tokenWithAuthorizedEntity?)

因此,它应该工作的方式是在请求令牌本身时检查错误,并在请求失败时以指数回退重试。更多信息请点击这里另外,请阅读此处的注释。GGLInstanceIDTokenHandler现在,如果您仍然想随时重新调用,您还应该deleteTokenWithAuthorizedEntity在获取新令牌之前实施。

什么时候应该调用startWithConfig?在获得 GCM 代币之前还是之后?

在您的中,AppDelegate.m您应该GGLInstanceID使用方法调用共享实例startWithConfig。本质上在GGLINstanceID.h类中,首先应该获取一个Instance ID;然后将项目授权为授权实体,然后通过iid服务获取注册令牌。请参阅此处GGLInstanceID.h的类的详细实现。

希望这个答案有帮助!

编辑

回答了你的问题了吗?要点是,确保目标的捆绑包标识符与 info.plist 文件中的 BUNDLE_ID 相同。

希望这可以解决该错误,如果没有发布您测试时发生的情况,我们可以从那里开始。:)