首页 文章

使用FCM进行IOS数据通知

提问于
浏览
8

我正在使用FCM(firebase Cloud 消息传递)向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() 仅在启动应用程序时调用,因此如果您发送数据消息,则不会显示任何后台消息 .

5 回答

  • 10

    我注意到,如果通知优先级设置为高,则应用程序强制关闭时通知将到达 .

    {  "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 .

    Update 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][;
    

    请注意,数据部分也包含在已接收的消息中 .

    Update 2:

    单个设备上的多个用户或具有多个设备的一个用户 .

    在服务器端,您必须确保只能为一个用户分配一个唯一的fcm_id . 这意味着一个设备被分配给一个用户,因此每个设备只会通知一个用户 .

    此外,一个用户可以拥有多个fcm_id,这意味着用户可以拥有更多设备并进行登录 .

    当user_2登录到user_1的同一设备时,必须将fcm_id与user_1分离并附加到user_2 . 通过这种方式,只有当前登录的用户才会收到该消息 .

  • 10

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

    据我所知,到目前为止,没有办法在ios方面正确解决这个问题 . 它在android端完美运行,因为应用程序在所有状态(前景,后台和关闭)中被唤醒 .

    您可以发送两种消息:

    notification-message 由操作系统直接显示和处理 .

    由应用程序处理的 data-message .

    如果添加自定义标记,它现在将成为数据消息,并且必须由应用程序处理 . 您可以在数据消息中添加 content_available 标记以让应用程序知道该消息,但问题是如果应用程序处于前台(已打开)或后台,则数据消息仅传递给ios中的应用程序(最小化) . 如果用户具有应用程序(即使启用了后台通知),则不会将数据消息传递到应用程序 .

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

  • 5

    来自Firebase的糟糕文档!

    对于ios,应用程序被杀时无法接收数据消息 . 但这没有提到他们文档中的任何地方所以我联系了Firebase,这就是他们所说的 .

    “虽然有一个content_available参数,但是当应用程序被杀死时无法接收数据消息 . 它只能在后台和前台接收 . 如果你希望在应用程序被杀时接收数据消息,你需要沿着它发送它显示消息“ .

    因此,如果您曾想过在FCM中使用相同的有效负载用于Android和Ios,那么最好使用APNS for ios .

  • 1

    关键问题是向特定用户组发送消息以获取登录的最新身份 .

    实际上,您可以使用主题消息来解决问题 . 假设您有3个用户标签/组A,B和C.初始化FCM时,为所有用户注册1个主题,以确保您可以向所有用户标签发送消息 .

    对于特定用户标签,如果用户以A身份登录,则订阅A.用户退出并以B身份登录后,检查用户是否订阅了A / C.如果是,请取消订阅A / C然后订阅B.这样可以避免处理数据部分中涉及的标签 .

相关问题