Обновить текстовое значение UILabel при изменении разрешения пользователя на уведомление на странице настроек приложения? - PullRequest
0 голосов
/ 01 июня 2018

В моем случае Пользователь получит уведомление о получении Уведомления в приложении.Если пользователь нажимает «Не разрешать», UILabel обновляется с «Не включено».Если пользователь хочет изменить уведомление, пользователь перейдет на страницу настроек приложения, чтобы изменить статус разрешения уведомления.

func checkNotificationPermission(){

UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]){


        (granted, error) in

        if granted == true {

            DispatchQueue.main.async {
                    print("notificaation access true")
                     self.notificationAccessLbl?.text = "Enabled"         
        }
        }
        else {
            DispatchQueue.main.async {
                self.notificationAccessLbl?.text = "Not enabled" 
            }
        } 
    }
    UIApplication.shared.registerForRemoteNotifications() }

Но когда пользователь возвращается в приложение, UILabel не обновляется, когдапользователь заходит в приложение со страницы настроек.

для обновления UILabel в приложении после перехода пользователя со страницы настроек в приложение.Я позвонил

func checkNotificationPermission()

, чтобы обновить значение UILabel в методе ViewDidAppear(), и я зарегистрировал функцию в applicationwillbecomeactive method() Пожалуйста, помогите мне в этом.

1 Ответ

0 голосов
/ 01 июня 2018

У меня есть переключатель на странице настроек в приложении, которое позволяет пользователю включить отключение push, и оно будет отправлено на сервер, но до того, как этот пользователь должен был разрешить push на странице настроек устройства.вот мое решение

Я создал глобальный объект

var isPushEnabledFromSettings = false {
    didSet {
         // you can set label value here in main queue
    }
}

и один метод, чтобы проверить его

func isPushPermissionGiven (permission:@escaping (Bool) -> ()) {
    if #available(iOS 10.0, *) {
        let current = UNUserNotificationCenter.current()
        current.getNotificationSettings(completionHandler: {settings in
            switch settings.authorizationStatus {
            case .notDetermined:
                permission(false)
            case .denied:
                permission(false)
            case .authorized:
                permission(true)
            }
        })
    } else {
        // Fallback on earlier versions
        if UIApplication.shared.isRegisteredForRemoteNotifications {
            permission(true)


        } else {
            permission(false)

        }
    }
}

, и в поле зрения загрузки добавил эти строки

    self.isPushPermissionGiven { (permission) in
        self.isPushEnabledFromSettings = permission
    }

    NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationDidBecomeActive, object: nil, queue: .main) {[weak self] (notificaiont) in
        guard let strongSelf = self  else {return }

        strongSelf.isPushPermissionGiven { (permission) in
            DispatchQueue.main.async {
                strongSelf.isPushEnabledFromSettings = permission
            }
        }
    }

Теперь у меня есть переключатель на странице настроек, который позволяет пользователю включить отключение push

@objc func switchChanged (sender:UISwitch) {

    guard self.isPushEnabledFromSettings else {
        AppDelegate.sharedDelegate.navigateUesrToSettings(withMessage: "Please grant push permission from settings")
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
            sender.setOn(false, animated: false)
        })
        return

    }
}



  func navigateUesrToSettings (withTitle title:String = "YourApp", withMessage message:String) {
        let alertController = UIAlertController (title: title, message: message, preferredStyle: .alert)

        let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
            guard let _ = URL(string: UIApplicationOpenSettingsURLString) else {
                return
            }

            self.navigate(To: UIApplicationOpenSettingsURLString)

        }
        alertController.addAction(settingsAction)
        let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
        alertController.addAction(cancelAction)

        AppDelegate.sharedDelegate.window?.rootViewController?.present(alertController, animated: true, completion: nil)
    }

Надеюсь, это полезно для вас:)

...