通过FCM的iOS严重警报

时间:2018-10-05 03:36:59

标签: ios firebase push-notification apple-push-notifications firebase-cloud-messaging

iOS 12添加了严重警报。 APNS有效载荷具有sound dictionary以支持紧急警报。 FCM有效负载中是否有等效的声音字典支持,可将FCM通知发送到iOS设备。

3 个答案:

答案 0 :(得分:1)

FCM中目前没有声音字典支持,这等效于iOS的声音字典。就像您确定的那样,在声音上,带有APNs的FCM对应的是sound参数:

  

设备收到通知时播放的声音。

     

声音文件可以位于客户端应用程序的主捆绑包中,也可以位于应用程序数据容器的Library / Sounds文件夹中。有关更多信息,请参见iOS Developer Library

但是,从UNNotificationSound文档中读取信息,也许您可​​以尝试添加包含标识符(例如data)的"isCritical": "true"消息有效负载,然后让您的应用根据需要进行处理。< / p>

答案 1 :(得分:1)

回答我自己的问题。

由于FCM有效负载不支持iOS声音字典,因此我不得不依靠通知扩展来完成操作。我将设置为1的“紧急”标志作为FCM数据有效载荷的一部分发送,并在通知扩展中使用它,以将通知标记为紧急。

class NotificationService: UNNotificationServiceExtension {
    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
       self.contentHandler = contentHandler
       bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
       let userInfo: [AnyHashable : Any] = (bestAttemptContent?.userInfo)!
       if let apsInfo = userInfo["aps"] as? [AnyHashable: Any], let bestAttemptContent = bestAttemptContent, let critical =  userInfo["critical"] as? String, Int(critical)! == 1 {
            //critical alert try to change the sound if sound file is sent in notificaiton.
            if let sound = apsInfo["sound"] as? String {
                //sound file is present in notification. use it for critical alert..
                bestAttemptContent.sound =
                    UNNotificationSound.criticalSoundNamed(UNNotificationSoundName.init(sound),
                                                           withAudioVolume: 1.0)
            } else {
                //sound file not present in notifiation. use the default sound.
                bestAttemptContent.sound =
                                UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0)
            }
            contentHandler(bestAttemptContent)
        }
    }
}

答案 2 :(得分:0)

Firebase 现已添加了关键警报。

它可以像这样添加到 MessagingPayload 中:

const messagingPayload = {
  token: this.FCMToken,
  notification: {
    ...payload,
  },
  apns: {
    payload: {
      aps: {
        criticalSound: {
          critical: true,
          name: 'default',
          volume: 1.0,
        },
      },
    },
  },
};

return admin.messaging().send(messagingPayload);

文档可能有点混乱。您必须使用 messages().send() 并在有效负载中对​​令牌进行编码,而不是使用 messages().sendToDevice()。

有效载荷消息是一个 TokenMessage https://firebase.google.com/docs/reference/admin/node/admin.messaging.TokenMessage

附上

您还需要从 Apple 获得授权,然后才能使用严重警报: https://developer.apple.com/contact/request/notifications-critical-alerts-entitlement/