我想知道我是否可以通过Firebase向用户发送多个推送通知,然后在用户在设备上看到它们之前拦截它们,并允许我的应用程序有选择地允许通知。
这可能吗?
如果是这样,我需要使用哪种方法?(来自react-native-firebase
或iOS
(
尝试使用UNNotificationServiceExtension
(可从iOS 10
获得(。您需要向项目添加扩展(示例如何添加(。
在扩展中实现方法- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler;
后。
它将在向用户显示通知之前被调用,您可以尝试执行一些操作(例如:将一些数据保存到本地(。
请注意,它仅适用于iOS 10 rich notifications
(如何使用Firebase实现它(。
附言希望对您有所帮助!
编辑:
在 Apple 文档中写道:
重写此方法并使用它来修改 未公开内容 随通知一起传递的对象。
更新:
您可以尝试从服务器发送静默推送通知,检查它并创建本地通知以在需要时向用户显示。
FireBase 通知可以在应用程序处于前台状态时处理。首先,您可以在控制器和 info.plist 中从"始终"更改使用通知。设置后,您可以在应用程序委托或视图控制器中控制通知。
new
您可以向用户发送静默通知,并将实际通知安排为本地通知
参考这个
老
(在火力基地的情况下( 只有在应用处于前台时,通知才可管理。如果应用在后台运行,则无法处理,因为用户将收到通知,并且在点击通知之前不会通知应用。
发送带有"content-available" : 1
的静默远程通知,并决定是否要向用户显示它。
{
"aps" = {
"content-available" : 1,
"sound" : ""
};
// add custom key value for message
}
如果要向用户显示它,请获取消息的自定义键值对,并触发本地通知以显示用户。它也将在后台工作。 UIBackgroundMode
需要为远程通知启用。
您可以发送将在前台和后台接收的数据通知。在iOS中,它们由委托方法处理 application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
,处理后,您可以决定是否为用户创建推送。
@update
用于在低于 10 的 iOS 上接收数据消息(非推送(
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
handleNotification(data: userInfo)
completionHandler(UIBackgroundFetchResult.newData)
}
在 iOS10 上
func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) {
handleNotification(data: remoteMessage.appData)
}
然后我只需检查自定义字段是否有我需要的数据,并使用通知中心创建本地通知
fileprivate func handleNotification(data: [AnyHashable : Any]) {
guard let topic = data["topic"] as? String else { return }
if data["receiver"] as? String == UserManager.shared.current(Profile.self)?.uuid && topic == "coupons" {
displayNotification(data: data)
}
}
fileprivate func displayNotification(data: [AnyHashable : Any]) {
if #available(iOS 10.0, *) {
let content = UNMutableNotificationContent()
content.title = data["notification_title"] as! String
content.body = data["notification_body"] as! String
let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 1, repeats: false)
let request = UNNotificationRequest.init(identifier: data["topic"] as! String, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
} else {
if currentNotification != nil {
UIApplication.shared.cancelLocalNotification(currentNotification!)
}
let notification = UILocalNotification()
notification.fireDate = Date()
notification.category = data["topic"] as? String
notification.alertBody = data["notification_body"] as? String
if #available(iOS 8.2, *) {
notification.alertTitle = data["notification_title"] as? String
}
currentNotification = notification
UIApplication.shared.scheduleLocalNotification(currentNotification!)
}
}
请记住,这适用于数据通知而不是推送通知,但在Firebase中,您可以发送这两种类型。