【发布时间】:2014-06-15 03:25:54
【问题描述】:
我想获取CMMotionActivityManager 的授权状态。对于日历和位置等其他服务,我们在 API 中有一些属性可以为我们提供这些类的用户授权状态。如何获取CMMotionActivityManager 类的授权状态?
【问题讨论】:
标签: ios iphone core-motion cmmotionmanager
我想获取CMMotionActivityManager 的授权状态。对于日历和位置等其他服务,我们在 API 中有一些属性可以为我们提供这些类的用户授权状态。如何获取CMMotionActivityManager 类的授权状态?
【问题讨论】:
标签: ios iphone core-motion cmmotionmanager
CMMotionActivityManager 目前不提供像其他框架一样直接检查授权状态的方法。
iOS - is Motion Activity Enabled in Settings > Privacy > Motion Activity
但是,正如上述问题中的 cmets 所述,如果您尝试使用查询
queryActivityStartingFromDate:toDate:toQueue:withHandler
如果用户没有授权你的应用,处理程序(CMMotionActivityQueryHandler)会返回这个错误。
CMErrorMotionActivityNotAuthorized
【讨论】:
随着 IOS 11.* 的引入,可以调用 CMMotionActivityManager.authorizationStatus() 来为您提供详细状态。
【讨论】:
这是我的做法:
manager = CMMotionActivityManager()
let today = NSDate()
manager.queryActivityStartingFromDate(today, toDate: today, toQueue: NSOperationQueue.mainQueue(),
withHandler: { (activities: [CMMotionActivity]?, error: NSError?) -> Void in
if let error = error where error.code == Int(CMErrorMotionActivityNotAuthorized.rawValue){
print("NotAuthorized")
}else {
print("Authorized")
}
})
【讨论】:
manager.startActivityUpdates(to:withHandler:) 尚未被调用。 manager.queryActivityStarting(from:to:to:withHandler:) 是对运动数据的一次性请求,不会持续更新。
我不得不针对 Swift 3.0 稍微调整 Zakaria 的答案,而且新的 Error 也产生了问题,所以我不得不将它转换回 NSError 来获取代码,但这就是我的函数现在的样子。谢谢!
func triggerActivityPermissionRequest() {
let manager = CMMotionActivityManager()
let today = Date()
manager.queryActivityStarting(from: today, to: today, to: OperationQueue.main, withHandler: { (activities: [CMMotionActivity]?, error: Error?) -> () in
if error != nil {
let errorCode = (error! as NSError).code
if errorCode == Int(CMErrorMotionActivityNotAuthorized.rawValue) {
print("NotAuthorized")
}
} else {
print("Authorized")
}
manager.stopActivityUpdates()
})
}
【讨论】: