Swift:CMAuthorizationStatus的侦听器更改

时间:2018-08-29 18:12:14

标签: ios swift core-motion

是否可以检测到CMAuthorizationStatus的变化?

目前似乎只能致电例如CMMotionActivityManager.authorizationStatus()获取状态。但是,我正在寻找一种方法来通过状态改变(或用户在设置中禁用/启用了运动和健身权限)通过侦听器获取更改事件。

由于状态也只能通过函数获取,因此我无法在该值上设置KVO。

期待您的帮助。

1 个答案:

答案 0 :(得分:1)

我一直在同一个问题上挣扎,我想在设置过程中一次请求授权,因此用户不必以后再处理该对话框,然后在每次启动该应用程序时检查权限。

为此,我编写了以下代码,首先检查是否已设置授权,然后启动应调用权限对话框的调用。在此调用中,我请求从现在到现在的活动数据,理论上这没有任何意义,但是在取消权限对话框后返回一个值或错误。

func checkMotionPermission(closure: @escaping (Bool) -> Void) {
    switch CMMotionActivityManager.authorizationStatus() {
    case .authorized:
        closure(true)
    case .notDetermined:
        let activityManager = CMMotionActivityManager()
        activityManager.queryActivityStarting(from: Date(), to: Date(), to: .main) { (activity, error) in
            let auth = CMPedometer.authorizationStatus()
            switch auth {
            case .authorized:
                closure(true)
            default:
                closure(false)
            }
        }
    default:
        closure(false)
    }
}

要更改权限状态,您可以在应用程序每次进入前台(在AppDelegate中)时调用此方法,因为那是(只有不在您的应用程序中)用户才可以更改许可。