如何监听通知授权状态的变化

Posted

技术标签:

【中文标题】如何监听通知授权状态的变化【英文标题】:How to listen to the changes in notification authorization Status 【发布时间】:2018-07-18 05:35:08 【问题描述】:

在我的应用程序中,如果收到通知,控制器有一个设置。当用户尝试打开接收通知但通知在系统设置中关闭时,它会弹出一个对话框将用户重定向到系统设置以首先打开它。我想知道用户是否在重定向后打开/关闭通知设置,然后我可以做一些额外的任务。

【问题讨论】:

您在寻找这个***.com/a/50645392/4601900 吗? @PrashantTukadiya 这是我目前实施的。但是我想知道是否有听知道系统设置改变了。 我告诉过你的。如果有人更改了设备的设置,那么他/她需要将您的应用程序置于后台,以便您可以检查 NSNotification.Name.UIApplicationDidBecomeActive 通知。正确检查答案有提到这件事 如果用户在系统设置中打开但不返回应用程序怎么办? 为什么需要检查? 【参考方案1】:

viewDidLoad,您可以添加观察者来收听通知设置状态。然后用最新状态做一些事情。参考以下代码:

override func viewDidLoad() 
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(checkNotificationStatus), name: UIApplication.didBecomeActiveNotification, object: nil)


@objc private func checkNotificationStatus() 
    UNUserNotificationCenter.current().getNotificationSettings  (settings) in
        switch settings.authorizationStatus 
        case .authorized, .denied, .provisional, .notDetermined:
            print("Do something according to status")
        
    

【讨论】:

我喜欢这个答案,因为它还可以处理用户从设置应用手动更改应用通知设置的情况【参考方案2】:

您可以使用以下代码来检查应用的通知设置是否打开/关闭。

func setPushPermission()
        if #available(ios 10.0, *) 
            let center = UNUserNotificationCenter.current()
            center.getNotificationSettings  (settings) in
                if(settings.authorizationStatus == .authorized) 
                    self.pushPermission = .Allowed
                 else if(settings.authorizationStatus == .denied) 
                    self.pushPermission = .Disallowed
                 else 
                    self.pushPermission = .UnDefined
                
            
        else
            let notificationSettings = UIApplication.shared.currentUserNotificationSettings
            let status = notificationSettings?.types.contains(.alert)
            if status == true 
                self.pushPermission = .Allowed
            
        
    
    func registerForUserNotification()
        if #available(iOS 10.0, *) 
            UNUserNotificationCenter.current().requestAuthorization(options: [UNAuthorizationOptions.alert, UNAuthorizationOptions.sound, UNAuthorizationOptions.badge])  (willAllow: Bool, error: Error?) in

                if willAllow == true
                
                    self.pushPermission = .Allowed
                    //[[UIApplication sharedApplication] registerForRemoteNotifications];
                    //                  UIApplication.shared.registerForRemoteNotifications()

                else
                    self.pushPermission = .Disallowed
                
                NotificationCenter.default.post(name: NSNotification.Name("PushPermissionChaged"), object: nil)

            
            UNUserNotificationCenter.current().delegate = self

        else
            let userNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)

            // Register User Notification Settings
            UIApplication.shared.registerUserNotificationSettings(userNotificationSettings)
            self.pushPermission = .Allowed
        
    

【讨论】:

【参考方案3】:

iOS10+ RxSwift监听认证状态解决方案。

它适用于手动更改设置并在询问访问时接受/拒绝

extension Reactive where Base: UNUserNotificationCenter 
    var isAuthorized: Observable<Bool> 
        UIApplication.shared.rx.applicationDidBecomeActive
            .flatMap  [base] _ -> Observable<Bool> in
                Observable.create  observer in
                    base.getNotificationSettings(completionHandler:  (settings: UNNotificationSettings) in
                        guard settings.authorizationStatus == .authorized else 
                            observer.onNext(false)
                            return
                        
                        observer.onNext(true)
                    )
                    return Disposables.create()
                
           
    

更新:需要使用 RxAppState github.com/pixeldock/RxAppState 库。

【讨论】:

您的代码涉及 RxAppState github.com/pixeldock/RxAppState,我说得对吗?

以上是关于如何监听通知授权状态的变化的主要内容,如果未能解决你的问题,请参考以下文章

如何监听 FutureBuilder 小部件内的状态变化并反映状态变化?

Android如何监听GPS状态变化?

如何监听状态属性变化 Flutter bloc 模式

ContentObserver监听媒体库变化

react监听仓库数据变化

nextjs如何监听页面变化