在iOS上使用GCM时出现“未知令牌”错误

5
我已在iOS应用中安装了GCM,在开发阶段一切正常,我能够收到推送通知。但是当我将其发布到应用商店时,设备上没有收到任何推送通知(Android中正常工作)。
我在iOS设备上安装了PersistentConnectionLogging.mobileconfig文件以查看日志,以下是我看到的内容:
“Received incoming push notification for topic: com.bundle.id but for a completely unknown token XYZ”
这里是确切的输出消息。
Jun 24 11:45:35 iPhone apsd[103] <Notice>: 2016-06-24 11:45:35 -0700 apsd[103]: Received incoming push notification for topic: com.bundle.id but for a completely unknown token <95af08c3 c74a13bf 6b6fb270 c486f2b3 58989f44 dfe69bc0f 95u410e1 2431b8dc>
Jun 24 11:45:35 iPhone apsd[103] <Notice>: 2016-06-24 11:45:35 -0700 apsd[103]: <APSCourier: 0x137d035e0>: Responding with REMOVED status for message received with topic: 'com.bundle.id' to device token (instead of per-app token)

有什么想法是为什么会发生这种情况吗?为什么标记是“未知”的?它属于谁呢?

你是否尝试检查是否已正确实现了在iOS客户端应用程序上接收消息设置iOS上的GCM客户端应用程序?如果您认为这是一个错误,请将其提交到问题跟踪器。这里有Google示例可供参考代码。希望这可以帮助到您。 - abielita
2
你从 GCM 服务器收到了什么响应?是成功的吗?如果不是,可能是因为在生产环境下未设置 kGGLInstanceIDAPNSServerTypeSandboxOption 值。 - AL.
一旦您通过TestFlight或App Store安装了您的应用程序,您需要一个生产证书以进行推送通知。仅有开发者证书才能在Xcode内部使用调试版本。 - Peter Grundner
1
这是一个非常令人沮丧的问题。刚刚在应用商店更新了一个应用程序,通知功能正常工作,但现在,在测试设备上,第一次安装在iOS10上完美地运行,只要我使用调试会话。如果我停止会话并重新启动,则iOS会失去对正确标记的跟踪,并使用强制正确标记未知的缓存版本,并将通知仅传递到设备而不是我的应用程序。我重新启动设备,一切都很好,但这太奇怪了。如果通知能够放置所请求的声音文件,那就没问题了,但它当然找不到它,因为它在应用程序中。 - drew..
2个回答

1

你尝试过测试你的推送证书吗?通常可以使用GitHub上的Houston进行证书测试。如果第三方推送无法正常工作,则需要重新创建证书。

在Cli中使用Houston:

apn push "<5e8f5cc0 be283f88 cc4ebb7d b6091499 80f51631 5ebf4928 b59a2a62 198d20d0>" -c -out "apple_push_notification.pem" -m "Hello from the command line!"

*Houston建议,* 我们建议您上传开发证书、生产证书和任何Ad-Hoc证书。Layer将自动确定要使用哪个证书。

其他可能的原因:

  • 您是否正确调用了[layerClient updateRemoteNotificationDeviceToken...]

  • 您是否在didRegisterForRemoteNotificationsWithDeviceToken内部调用以向Layer发送设备令牌?

您还可以通过实现didFailToRegisterForRemoteNotificationsWithError来检查应用程序是否无法注册。如果查看错误,您应该能够找出为什么没有看到推送的原因。

Obj-C错误检查示例

- (void) application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"PUSH ERROR: %@", error);
}

示例 Swift 错误检查:

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError!) {
print("PUSH ERROR: \(error)")
}

Xcode/证书问题的潜在原因:

  • 配置文件不是最新的。设备信息存储在证书中,因此每次向配置文件添加新设备时,您都需要重新创建配置文件和证书。
  • 确保您的XCode项目设置指向正确的证书和配置文件。
  • 在Keychain Access应用程序内部,确保您正在导出密钥和证书。

0
iOS应用提供两种类型的证书,一种是开发模式下的证书,另一种是生产模式下的证书。如果您正在使用开发证书,则创建的令牌是开发令牌,不能在生产模式下使用。您必须使用生产证书并创建生产令牌。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接