我正在使用FCM(firebase云消息传递)发送" custom"向IOS应用程序发送数据通知。据我所知,当您希望FCM处理在您的应用上显示通知时,我们会使用通知消息。当您只想在应用中处理消息时,我们会使用数据消息。这是设计的。
我面临的问题是,Device / InstandID令牌对于已安装的应用程序是唯一的,而不是登录应用程序的用户。因此,要解决此问题,我将在数据中发送预期的用户标记,以便它成为数据消息。由于应用程序处理数据通知,因此只有在打开应用程序并且仅显示通知时才会触发didReceiveRemoteNotification()回调,而不会立即显示通知。
我的问题是,我是否可以发送自定义数据通知消息,即使应用关闭也会立即显示。
这是我发送给FCM的有效负载:
{
registeration_ids : [<id_1>, <id_2>],
data : {
title : message_title,
body : message_body,
intended_user : message_user
}
}
在Android FirebaseMessagingService.onMessageReceived()
中调用即使应用程序在后台但在ios didReceiveRemoteNotification()
中仅在应用程序启动时调用,因此如果您发送数据消息,则不会显示任何后台消息。< / p>
答案 0 :(得分:16)
尝试将content_available设置为true。
来自fcm文档:
注意:如果您想在应用程序位于后台时将仅包含自定义键值的消息发送到iOS设备,请在数据键中设置自定义键值对,并将content_available设置为true。
{
registeration_ids : [<id_1>, <id_2>],
content_available: true,
data : {
title : message_title,
body : message_body,
intended_user : message_user
}
}
答案 1 :(得分:15)
据我所知,到目前为止,没有办法在ios方面正确解决这个问题。它在android端完美运行,因为应用程序在所有状态(前景,背景和关闭)中被唤醒。
您可以发送两种消息:
通知消息,由操作系统直接显示和处理。
由应用程序处理的数据消息。
如果添加自定义标记,它现在变为数据消息,并且必须由应用程序处理。您可以在数据消息中添加content_available
标记,以便让应用程序知道该消息,但问题是如果应用程序处于预置(打开)状态,则数据消息仅以ios的形式传递给应用程序。在后台(最小化)。如果用户已“强制关闭”应用程序(即使启用了后台通知),也不会将数据消息传递给应用程序。
解决方案是在服务器端处理目标用户,并通过维护一对一设备令牌与用户关系来解决多用户到单设备令牌问题。
答案 2 :(得分:12)
来自Firebase的糟糕文档!
对于ios,应用程序被杀时无法接收数据消息。但是在他们的文档中没有提到这一点。所以我联系了Firebase,这就是他们所说的。
&#34;虽然有content_available参数,但在应用程序被杀死时无法接收数据消息。它只能在背景和前景中接收。如果您希望在应用程序被杀时接收数据消息,则需要将其发送到显示消息&#34;。
因此,如果您曾想过在FCM中使用相同的有效负载用于Android和Ios,那么最好使用APNS for ios。
答案 3 :(得分:11)
我注意到,如果通知优先级设置为高,则在强制关闭应用时会收到通知。
{ "notification": {
"body" : "This week’s edition is now available.",
"title": "Portugal vs. Denmark",
"text": "5 to 1",
"content_available": 1
},
"data" : {
"volume" : "3.21.15",
"contents" : "http://www.news-magazine.com/world-week/21659772"
},
"to" : "fqUk65A1kTE:APA91bG5...", // or set topic like "/topics/test"
"priority" : "high"
}
对于iOS客户端应用,普通和高优先级类似于APN优先级5和10。
从iOS文档中可能无法提供具有默认优先级的通知。
apns-priority:通知的优先级。指定以下值之一:
10 - 立即发送推送消息。具有此优先级的通知 必须在目标设备上触发警报,声音或徽章。它是一个 将此优先级用于仅包含的推送通知时出错 内容可用密钥。
5 - 一次发送推送消息 考虑设备的功率考虑因素。通知 具有此优先级的可能会被分组并以突发方式传递。他们是 节流,在某些情况下不交付。如果省略这个 标头,APNs服务器将优先级设置为10。
更新1:
以上通知是通过FCM api发送的,并且在应用程序被杀时收到了该通知。 点击设备上的通知后,这是应用启动后设备日志中显示的内容:
...didReceiveRemoteNotification: [gcm.message_id: 0:1468481012881485%e1d60a46e1d60a46, volume: 3.21.15, aps: {
alert = {
body = "This week\U2019s edition is now available.";
title = "Portugal vs. Denmark";
};
}, contents: http://www.news-magazine.com/world-week/21659772][;
请注意,数据部分也包含在收到的消息中。
更新2:
单个设备上的多个用户或具有多个设备的一个用户。
在服务器端,您必须确保只能为一个用户分配一个唯一的fcm_id。这意味着一个设备被分配给一个用户,因此每个设备只会通知一个用户。
此外,一个用户可以拥有多个fcm_ids,这意味着用户可以拥有更多设备并登录。
当user_2登录到user_1的同一设备时,必须将fcm_id与user_1分离并附加到user_2。通过这种方式,只有当前登录的用户才会收到该消息。
答案 4 :(得分:1)
关键问题是向特定用户组发送消息,以获取登录的最新身份。
实际上,您可以使用主题消息来解决问题。假设您有3个用户标签/组A,B和C.初始化FCM时,为所有用户注册1个主题,以确保您可以向所有用户标签发送消息。
对于特定用户标签,如果用户以A身份登录,则订阅A.用户退出并以B身份登录后,检查用户是否订阅了A / C.如果是,请取消订阅A / C然后订阅B.这样就可以避免处理数据部分中涉及的标签。