适用于 iOS 的 GCM 下游消息传递 JSON 格式

Posted

技术标签:

【中文标题】适用于 iOS 的 GCM 下游消息传递 JSON 格式【英文标题】:GCM downstream messaging JSON format for iOS 【发布时间】:2016-03-08 16:47:44 【问题描述】:

我有一个使用 GCM 作为通知 (WIP) 的 swift/ios9 应用程序。

应用程序授权正常。 证书没问题。 配置文件确定。 一切都在 Apple 的开发者门户上进行配置以进行开发。

收到通知时调用此函数。

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) 
  GCMService.sharedInstance().appDidReceiveMessage(userInfo);
  print(userInfo.debugDescription)

问题

当服务器发送以下格式时,我只能在前面描述的函数中检测到通知,并且它“有效”,因为我有一个断点来检测它,否则什么也不会发生。


  "registration_ids" : ["regId"],
  "data" :
   
      "to" : "regId",
      "notification" : 
      
         "sound" : "default",
         "badge" : "2",
         "title" : "anyTitle",
         "body" : "anyMessage" 
      
   

网络服务负责人为我制作了这个,它复制了现有的 android 服务(“registration_ids”有用吗?)。

由于行为不是预期的,我们从 GCM 网站尝试了这个:

"to" : "regId", “content_available”:是的, “通知” : "body" : "绝配!", "title" : "葡萄牙 vs. 丹麦"

消息创建错误服务器端(GCM 格式无效?)

我们是否遗漏了一些明显的东西?

请求是 post 和 headers/url:

https://gcm-http.googleapis.com/gcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

编辑

添加工作日志和非工作日志。

  
   "registration_ids":[  
      "regId"
   ],
   "data":  
      "to":"regId",
      "notification":  
         "sound":"default",
         "badge":"2",
         "title":"testNotif",
         "body":"welcome in the Showcase Apple owner"
      
   

Exchange[
Id                  ID-FR-LIL-D00184-54996-1457452459441-0-5
ExchangePattern     InOnly
Headers             Accept=text/html,application/xhtml+xml,application/xml;q=0.9,​*/*​;q=0.8, Accept-Encoding=gzip, deflate, Accept-Language=fr-fr, Authorization=key=AIzaSyAB_E2Op0GqShCmCmh_6ZxnwrFKoXOaIHU, beaconId=46589-47438, breadcrumbId=ID-talend2-48271-1456928459992-11-173, Cache-Control=max-age=0, CamelHttpMethod=POST, CamelHttpPath=, CamelHttpQuery=custLogin=alex@cgi.com&beaconId=46589-47438&regId=khjGINhshr4:APA91bGXuzrC3tU_jkBMZGCziqIwA9wKv1B-U4acxy68sQxvChJQvKb187o863CzKJyop1AwhP0BNo7I2SJJiWdrtnHFC42LxcBQzOo2Ah868xPde9TBFmj_FLVG8rhyH4Yl48zuQMCJ, CamelJmsDeliveryMode=2, CamelRedelivered=false, CamelRedeliveryCounter=0, CamelServletContextPath=/setBeaconEvent, Connection=keep-alive, Content-Type=application/json, custLogin=, dateEvent=20160308172331, deviceType=ios, DNT=1, Host=192.168.1.239, JMSCorrelationID=null, JMSDeliveryMode=2, JMSDestination=queue://Q.NOTIFIER, JMSExpiration=0, JMSMessageID=ID:FR-LIL-D00184-64570-1457442695117-1:52:1:1:1, JMSPriority=4, JMSRedelivered=false, JMSReplyTo=null, JMSTimestamp=1457454212345, JMSType=null, JMSXGroupID=null, JMSXUserID=null, regId=khjGINhshr4:APA91bGXuzrC3tU_jkBMZGCziqIwA9wKv1B-U4acxy68sQxvChJQvKb187o863CzKJyop1AwhP0BNo7I2SJJiWdrtnHFC42LxcBQzOo2Ah868xPde9TBFmj_FLVG8rhyH4Yl48zuQMCJ, User-Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/601.4.4 (KHTML, like Gecko) Version/9.0.3 Safari/601.4.4
BodyType            String
Body                "registration_ids":["khjGINhshr4:APA91bGXuzrC3tU_jkBMZGCziqIwA9wKv1B-U4acxy68sQxvChJQvKb187o863CzKJyop1AwhP0BNo7I2SJJiWdrtnHFC42LxcBQzOo2Ah868xPde9TBFmj_FLVG8rhyH4Yl48zuQMCJ"],"to":"khjGINhshr4:APA91bGXuzrC3tU_jkBMZGCziqIwA9wKv1B-U4acxy68sQxvChJQvKb187o863CzKJyop1AwhP0BNo7I2SJJiWdrtnHFC42LxcBQzOo2Ah868xPde9TBFmj_FLVG8rhyH4Yl48zuQMCJ", "content_available": true, "notification":"title": "testNotif","body": "welcome in the Showcase Apple owner" 
]
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.apache.camel.component.http.HttpOperationFailedException: HTTP operation failed invoking https://android.googleapis.com/gcm/send?custLogin=alex@cgi.com&beaconId=46589-47438&regId=khjGINhshr4:APA91bGXuzrC3tU_jkBMZGCziqIwA9wKv1B-U4acxy68sQxvChJQvKb187o863CzKJyop1AwhP0BNo7I2SJJiWdrtnHFC42LxcBQzOo2Ah868xPde9TBFmj_FLVG8rhyH4Yl48zuQMCJ with statusCode: 400

EDIT2

感谢 Arthur 的建议,通知现在没有错误地离开服务器,我收到了。

当前格式为:

  
  "to":"regId",
  "data":  
     "notification":  
        "sound":"default",
        "badge":"2",
        "title":"testNotif",
        "body":"welcome in the Showcase Apple owner"
     
  

剩下的问题是如果应用程序在后台,didReceiveRemoteNotification fetchCompletionHandler 不会收到它。 didReceiveRemoteNotification 在应用程序处于前台时也会收到它,但如果我不显示它,则不会发生任何事情。

我应该调用一些东西来获得“系统样式”通知吗?如果格式正确,它是否准备好开箱即用?

我在网上找不到有关此的信息。

【问题讨论】:

您从文档中尝试的对象似乎是正确的,您能否提供您向 GCM 发出的完整 http 请求。 刚刚编辑过@ArthurThompson。这是你想要的吗? 您似乎正在使用 reg_ids 和 to 一起。您应该使用 to(reg_ids 有效,但不推荐),永远不要同时使用它们。在第一个示例中,to 在数据中,因此它可能被忽略,但在第二个示例中,to 和 reg_ids 是兄弟姐妹,我认为这是格式问题。 @ArthurThompson 这似乎合乎逻辑,感谢您指出这一点!我明天试试这个。 好吧@ArthurThompson,如果您想将其发布为答案,它确实有效。你是今天的英雄,谢谢。一切看起来都很好,除了我仍然没有“系统通知”。没有自动的苹果风格通知,我不知道我是否需要做任何事情来启用它 【参考方案1】:

所以当您使用您提到的第一种格式时,您会收到通知(应用程序在断点处停止)?我唯一的想法是,当您收到通知时,您的应用程序可能在前台?它应该在后台或关闭,否则你不会注意到任何东西。

【讨论】:

我不这么认为,我也尝试在后台接收它【参考方案2】:

好吧,毕竟唯一的问题是 JSON 格式:

  
  "to":"regId",
  "notification":  
     "sound":"default",
     "badge":"2",
     "title":"testNotif",
     "body":"welcome in the shop Apple owner"
  

这样,通知由 APNS 处理并以正确的格式精确到达。

【讨论】:

以上是关于适用于 iOS 的 GCM 下游消息传递 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

GCM 是如何工作的? (适用于 Android 的谷歌云消息传递)

操作 GCM 下游消息

GCM 客户端收不到下游消息

拦截所有 GCM 推送消息(适用于任何应用程序)

带有PHP的Android中的高优先级GCM消息?

适用于 Android 谷歌云消息 (GCM) 的 Azure 移动服务从不向设备发送通知