使用Xcode 7和iOS 9的Google Cloud Messaging

net*_*eot 11 ios google-cloud-messaging swift

我已经设法将GCM与Android设备一起使用,但现在我正在尝试在iOS应用上实现.

我想我已经遵循了所有必要的步骤来使用GCM服务.我已按照https://developers.google.com/cloud-messaging/ios/client?configured=true将服务添加到现有应用中.

我认为一切都配置正确,但我无法收到任何通知.我有APN证书和GoogleService-info.plist文件,在控制台上这是输出:

2016-01-05 13:47:53.864:GCM | 签入plist中的密钥无效:GMSInstanceIDDeviceDataVersion连接到GCM 2016-01-05 13:47:57.501:GGLInstanceID | 将来的签到时间戳无效.2016年1月5日13:47:57.501 TerneraGallega [1014:444977]与AUTHID签到成功:4958686017822257121,消化:KSJNg + Aj82uavBXrFeOAfA ==,lastCheckinTimestamp:1451998077000注册令牌:NC-dd9fCvFs:APA91bHMfbvLczxSPLQsLeEJASU_RfV4wvVuPs2u4VJDtpC8oB2cm1AKr6cH_LFeLsQzb94Kk9iwez8fsOvgzNns_9DU3i8Ema1oCKIwcNFzenNpAhViyGHah4E7-RkQlg1durYSEQRD已订阅/主题/全球

如果我发出POST请求,我会收到此消息:

{ "到": "NC-dd9fCvFs:APA91bHMfbvLczxSPLQsLeEJASU_RfV4wvVuPs2u4VJDtpC8oB2cm1AKr6cH_LFeLsQzb94Kk9iwez8fsOvgzNns_9DU3i8Ema1oCKIwcNFzenNpAhViyGHah4E7-RkQlg1durYSEQRD", "content_available":真实的, "通知":{ "体": "伟大的比赛!", "称号": "葡萄牙对丹麦"}}

第一次尝试它返回成功消息,但设备中没有显示日志和通知(应用程序位于前台)

几分钟后,再次尝试POST请求,它将返回失败

{"multicast_id":7256343774952522277,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]}

现在,我从Google页面下载了GCM示例,配置了APN并获得了GoogleService-info.plist,当它在设备上打开时启动GCM示例Swift文件它说:

注册成功!检查xcode调试控制台,你可以使用注册令牌...

在此之后,如果您设置POST请求

{ "到": "mVEtHyTXEOg:APA91bGvK_Uf2ZKgpguWUOto3CXQzIT1z22uJ446mYkNqMwL9VLDYdGtdm_4vS8rcl3T9OeqEC1UWbdKAOyuoweW1GiU0mv0cDSPW03y4XGx19JcR6rxsiWRNUjtADX6iNAW8wM8UBJl", "content_available":真实的, "通知":{ "体": "伟大的比赛!", "称号": "葡萄牙对丹麦"}}

它再次返回一个

{"multicast_id":7435981433811133310,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"}]}

在应用程序上实现GCM的人可以指出我缺少的东西吗?

- - - -编辑 - - - -

最后,我通过使用分发证书而不是开发证书使其工作......似乎我已经配置好了但是我遗漏了开发证书.

PS:在ID下的APN配置文件页面中,我启用了两个推送通知证书(这就是为什么我认为所有配置都很好)

但是我会把这个问题保持开放,因为我无法在开发环境下使用它

小智 1

我能够有效地完成与您编辑中的修复相同的操作,而不会弄乱证书​​。显然,如果您已经完成所有设置,并且正在使用开发和生产环境,那么这将不起作用,但如果您仅处于开发阶段,则很容易更改。

在应用程序的 Gcm 示例项目(针对 Objective-C)中:didRegisterForRemoteNotificationsWithDeviceToken 我只是将代码更改为:

    _registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken,
                             kGGLInstanceIDAPNSServerTypeSandboxOption:@YES};
Run Code Online (Sandbox Code Playgroud)

    _registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken,
                             kGGLInstanceIDAPNSServerTypeSandboxOption:@NO};
Run Code Online (Sandbox Code Playgroud)

我知道这并不完全是一个真正的修复,但它至少使它可以在不更改任何证书的情况下工作(只要设置了生产证书)。