快速满足条件时显示fcm通知

时间:2018-08-07 20:02:23

标签: ios swift firebase push-notification

我正在使用Firebase推送通知,我的应用已订阅一个主题,一切都很好。但是我想知道是否可以通过通知显示通知。这是我的场景:

local_user_id = 10

var payload = {
  notification: {
    title: "hi",
    body: "this is a notification",
    sound: "default"
  },
  data: {
    user_id: "1",
    message: "you should pay $3020.25"
  }
};

1)控制用户is_login是否为true(真/假) 2)获取通知的消息数据并检查:

if (payload.data.user_id = local_user_id && is_login){
     show_notification()
  }

3)显示通知

实际上我只有通知,没有更多,我是Firebase的新手,这是我的代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
      UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
                (granted, error) in
            }
            application.registerForRemoteNotifications()
            FirebaseApp.configure()
            return true
    }

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
            let dict = userInfo["aps"] as! NSDictionary
            let message = dict["alert"]
            print("response")
            print(message)
        }

我不知道该怎么做,可以吗? 预先感谢

2 个答案:

答案 0 :(得分:3)

您无法控制在应用程序中显示隐藏通知。您可以在后端设置一些逻辑,无论是否应显示此通知。不过,我有以下可能的解决方法。

  • 使用静默推送。然后触发本地通知。注意:无声 推送并不总是可靠的。
  • 因此只需在您的有效负载中包括 content-available:1 在下面获取静音通知。它将作为静音通知。
  • Info.plist 中也应将 UIBackgroundModes 设置为
    远程通知

,但仅限于运行和后台模式。如果在应用离线时将 content-available 设置为0,您将无法接收或处理它。

答案 1 :(得分:0)

如果您尝试在应用程序在前台运行时仅向用户显示通知,则需要使AppDelegate符合UNUserNotificationCenterDelegate。这是因为当应用程序运行时,通知将呈现给UNUserNotificationCenter共享对象。

extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void {

        let content = notification.request.content
        if content.data["user_id"] == local_user_id && is_login {
            completionHandler(.alert)
        } else {
            completionHandler([])
        }
    }
}

您可能要确保在此块中的某个时刻执行了completeHandler,因为这是处理通知的处理程序。如果您想要静音通知,则可以使用completionHandler([])来使警报静音。可以使用here来完成completeHandler的其他选项。