是否有办法检测 CMAuthorizationStatus
?
目前似乎只能通过调用例如 CMMotionActivityManager.authorizationStatus()
来获取状态。然而,我正在寻找一种方法,如果状态发生变化(或者用户在设置中禁用了Motion & Fitness权限),则通过监听器获取变化事件。
由于状态也只能通过函数获取,所以我无法对该值设置一个KVO。
期待您的帮助。
我一直在努力解决同样的问题,我想在设置过程中请求一次授权,这样用户就不必在以后处理对话框,然后在每次应用程序被启动时检查权限。
为此,我写了下面的代码,首先检查是否已经设置了授权,否则启动一个调用,应该调用权限对话框。在这个调用中,我请求了从现在到现在的活动数据,理论上没有任何意义,但在权限对话框被驳回后,返回一个值或一个错误。
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中)调用这个方法,因为那(虽然不在你的应用程序中)是用户能够改变权限的唯一时间。