使用Google Cloud Messaging和Phonegap Plugin Push设置iOS推送通知

时间:2016-05-08 18:45:21

标签: ios cordova google-cloud-messaging

我正在努力让GCM与我的iOS应用程序一起工作。我已经验证它确实可以在android版本上运行,但不适用于iOS。

我已设置GCM帐户,并上传了我的Dev和Prod .p12证书。

初始化插件时,我得到以下输出:

2016-05-08 18:11:05.657 MyApp[1234:12345678] Push Plugin register called
2016-05-08 18:11:05.658 MyApp[1234:12345678] PushPlugin.register: setting badge to false
2016-05-08 18:11:05.658 MyApp[1234:12345678] PushPlugin.register: clear badge is set to 0
2016-05-08 18:11:05.659 MyApp[1234:12345678] PushPlugin.register: better button setup
2016-05-08 18:11:05.660 MyApp[1234:12345678] GCM Sender ID **********
2016-05-08 18:11:05.660 MyApp[1234:12345678] Using GCM Notification
2016-05-08 18:11:05.695 MyApp[1234:12345678] Push Plugin register success: <**********....>
2016-05-08 18:11:05.790 MyApp[1234:12345678] GCM Registration Token: ******************************************

令牌似乎有效,我可以使用provided ruby server script向该令牌发送消息。

我收到的回复如下:

[{:response=>"success",
:body=>{"multicast_id"=>******, "success"=>1, "failure"=>0, "canonical_ids"=>0, "results"=>[{"message_id"=>"*******************"}]},
:headers=>
{"content-type"=>["application/json; charset=UTF-8"], "date"=>["Sun, 08 May 2016 18:24:35 GMT"], "expires"=>["Sun, 08 May 2016 18:24:35 GMT"], "cache-control"=>["private, max-age=0"], "x-content-type-options"=>["nosniff"], "x-frame-options"=>["SAMEORIGIN"], "x-xss-protection"=>["1; mode=block"], "server"=>["GSE"], "alternate-protocol"=>["443:quic"], "alt-svc"=>["quic=\":443\"; ma=2592000; v=\"33,32,31,30,29,28,27,26,25\""], "accept-ranges"=>["none"], "vary"=>["Accept-Encoding"], "connection"=>["close"]},
:status_code=>200}]

仍然,消息永远不会出现在我的iOS设备上。我进入了我的Android应用程序的日志并将GCM连接到那里,所以我可以看到消息的状态。从我的服务器发送到iOS设备的消息的状态为“已接受”。

Current Status  Accepted
Collapse Key    n/a
TTL 2,419,200

当我阅读documentation时,我认为它应该在Accepted, sent to APNS成功转发到APNS时说出来。我试图找到解决方案,但我还没找到。

问题可能是我的Android和iOS应用都在同一个谷歌应用上(因此具有相同的Server API Key和相同的Sender ID)?

1 个答案:

答案 0 :(得分:2)

GCM是使用Apple的推送通知技术实现的,当失败时,99%的时间是由于错误匹配发生在需要全部开发或所有产品相关的4个必需项链中的某个地方它的工作原理。

因此,您需要确定您使用的是dev或prod证书以及dev或prod令牌,以及您是否已将GMC帐户配置为dev或prod(这将更改GCM用于发送推送的网关)过度)。如果你检查所有这些,希望很有可能它会开始正常工作。  以下是一些进一步的细节:

当推送通知无法工作时,原因几乎肯定是因为推送“等式”已被打破。

有两个方程式,其中一个方程式必须严格遵循才能推动工作。

发展等式:

  

开发构建App +开发APN令牌+开发   证书+开发Apple网关==成功

生产方程:

  

App + Production APN令牌+制作的生产构建   证书+制作Apple网关==成功。

如果生产方程中有任何dev元素,或者在开发方程中有任何生产元素,则推送将不起作用。 等式的所有四个要素必须是全部开发或全部生产。

当您使用Xcode运行应用程序时,默认情况下它将是应用程序的开发版本(可以在方案中更改),因此在使用Xcode时,您必须使用开发公式才能使用它。 如果您创建了一个临时分发或应用商店版本,那么它将是一个生产版本,您必须使用生产等式才能使其生效。

此外,应用程序的生产版本和应用程序的开发版本会产生不同的推送令牌,因此,如果您暂时将令牌硬编码到某个服务器测试脚本或类似内容中,那么您必须确保其正确的令牌。 在旧版本的iOS中,一旦获得它们,它们实际上永远不会改变(它们可以,但是它很少见的情况)。但是在iOS9中不再是这种情况,令牌可以而且确实会发生变化,因此请始终确保您在服务器上使用的令牌是最新的。

还必须通过正确的网关发送推送,Apple开发网关是沙箱网关:

  

SSL://gateway.sandbox.push.apple.com:2195

生产网关是:

  

SSL://gateway.push.apple.com:2195

使用生产网关时,服务器必须使用生产证书进行签名,并在使用沙盒网关时使用开发证书进行签名。

如果对两个证书使用相同的密码,则可以在同一.pem文件中使用生产证书和开发证书对服务器进行签名。即您可以将所有提升证书和密钥连接到一个.pem文件中,并使用它来签署服务器。当使用Xcode和生产网关进行最终应用商店发布测试时,服务器当然需要使用沙箱网关。