带有FCM的IOS数据通知

我正在使用FCM(firebase云消息)将“自定义”数据通知发送到IOS应用程序。 据我所知,当您希望FCM代表应用程序显示通知时,我们会使用通知消息。 而我们只在您的应用程序中只处理消息时使用数据消息。 这是devise。

我面临的问题是,设备/ InstandID令牌是唯一的安装的应用程序,而不是用户login的应用程序。 所以为了解决这个问题,我在数据中发送了预期的用户标签,所以它变成了一个数据信息。 由于应用程序处理数据通知,因此只有在打开应用程序时才会触发didReceiveRemoteNotification()callback,并且只有在发送通知时才显示通知,而不是立即显示通知。

我的问题是,我可以发送一个自定义的数据通知消息,并使其即使应用程序closures即时显示。

这是我发送给FCM的有效载荷:

{ registeration_ids : [<id_1>, <id_2>], data : { title : message_title, body : message_body, intended_user : message_user } } 

在android中,即使应用程序位于后台,但在ios中,也会调用FirebaseMessagingService.onMessageReceived()只有在启动应用程序时才会调用didReceiveRemoteNotification()因此如果发送数据消息,则不会显示任何后台消息。

我注意到,当通知优先级设置为高时,通知将在应用程序强制closures时到达。

 { "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,这意味着用户可以拥有更多的设备并login。

当user_2login到user_1的同一个设备时,fcm_id必须从user_1分离出来,并且连接到user_2。 以这种方式,只有当前login的用户将收到该消息。

尝试将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 } } 

从我目前所了解的情况来看,在ios方面没有办法妥善解决这个问题。 它完美的工作在android方面,因为应用程序在所有状态(前景,背景和closures)醒来。

你可以发送两种消息:

由操作系统直接显示和处理的通知消息

由应用程序处理的数据消息

如果你添加一个自定义标签,它现在变成了一个数据消息,并且必须由应用程序来处理。 您可以在数据消息中添加一个content_available标记,以让应用程序知道消息,但问题是数据消息仅在应用程序处于前台(打开)或后台(ios)中时才会传递到ios中的应用程序最小化)。 如果用户已经“强制closures”应用程序(即使启用了后台通知),数据消息也不会传送到应用程序。

解决scheme是处理服务器端的预期用户,并通过维护一对一的设备令牌到用户关系来解决多用户到单设备令牌问题。