如果在iOS的didReceiveRemoteNotification中向GCM/FCM发送“数据”(但“通知”有效)负载,则无法接收推送通知。

5
我正在尝试让我们的iOS应用程序接收“数据”负载通知。目前,我们可以按照以下方式发送GCM notification推送通知:https://developers.google.com/cloud-messaging/concept-options(FCM具有相同的文本)。您可以使用 CURL 进行简单的测试。
curl -X POST \
  https://gcm-http.googleapis.com/gcm/send \
  -H 'authorization: key=##_GCM_SERVER_ID_##' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'postman-token: ##_POSTMAN_TOKEN_##' \
  -d '{
    "notification": {
        "body": "Test body"
    },
    "to" : "##_DEVICE_TOKEN_##"
}
'

这将成功触发iOS AppDelegate.didReceiveRemoteNotification:fetchCompletionHandler 函数。

然而,如果将其更改为data通知:

curl -X POST \
  https://gcm-http.googleapis.com/gcm/send \
  -H 'authorization: key=##_GCM_SERVER_ID_##' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'postman-token: ##_POSTMAN_TOKEN_##' \
  -d '{
    "data": {
        "body": "Test body"
    },
    "to" : "##_DEVICE_TOKEN_##"
}
'

我无法看到任何从GCM发送到应用程序的内容(在didReceiveRemoteNotification函数中),即使应用程序在后台/前台都是如此。尽管文档中说应该可以:https://developers.google.com/cloud-messaging/concept-options#notifications_and_data_messages 请注意以下特定于平台的细节:
  • 在Android上,数据有效负载可以在用于启动您的活动的Intent中检索。
  • 在iOS上,数据有效负载将在didReceiveRemoteNotification:中找到。
GCM可以处理纯数据推送通知到APN网络,对吗?与iOS中的通知推送相比,我需要做些特殊的事情才能接收数据推送通知吗?

可能是由于这个 https://dev59.com/yFsW5IYBdhLWcg3wDzgu#36019064 的原因。 - corgrath
是的,我也遇到了同样的问题。找到任何解决方法了吗? - TheTravloper
2个回答

3

当使用FCM向iOS设备发送数据类型的消息时,只有在你的FCM请求体中将content_available设置为true,才能接收到这些消息,例如:

{
    "to": "--fcm-token--",
    "content_available": true,
    "data": {
        "priority": "high",
        "hello": "world"
    }
}

“content_available” 在这里是关键! - Yi Wang

0

除了您分享的笔记之外,请不要忘记以下内容:

在iOS上,GCM会存储消息,并仅在应用程序在前台并已建立GCM连接时才传递它。

有了这个,您可能想要检查建立连接。然后,当您的XMPP连接建立时,CCS和您的服务器使用正常的XMPP <message>标签来来回发送JSON编码的消息。 <message>的主体必须是:

<gcm xmlns:google:mobile:data>
    JSON payload
</gcm>

此外,请注意,对于数据消息,message_id 是必填字段。请参考下行消息中显示的带有效载荷的消息的示例请求格式。您只需使用 CURL 进行转换即可。
<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGISTRATION_ID",  // "to" replaces "registration_ids"
      "message_id":"m-1366082849205" // new required field
      "data":
      {
          "hello":"world",
      }
      "time_to_live":"600",
      "delay_while_idle": true/false,
      "delivery_receipt_requested": true/false
  }
  </gcm>
</message>

更多信息,请参见XMPP连接服务器参考


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