我以多种方式使用 M7/M8 芯片的 MotionActivity,包括计步。对于计步,我既查询当天的步数,又请求实时发生的步数。
目前,在执行此操作之前,我会检查[CMStepCounter isStepCountingAvailable],以及本地覆盖标志,然后再继续执行此代码。如果未授予 motionActivity 授权,我假设 isStepCountingAvailable 将返回 FALSE。这似乎不是这种情况,它似乎更像是一种硬件检测。我似乎找不到其他方法来检测是否为此授予了授权。
这意味着 startStepCountingUpdatesToQueue 和 queryStepCountStartingFrom 都运行并返回 block ,但总是返回错误代码。特别是 CMErrorDomain 代码 105。
有没有更好的方法让我判断motionActivity是否未被授权?我有一些回退代码,但我更喜欢事先进行 bool 检查,而不是返回 block 中的错误代码。
if (self.useM7IfAvailable && [CMStepCounter isStepCountingAvailable]){
self.cmStepCounter = [[CMStepCounter alloc] init];
[self.cmStepCounter startStepCountingUpdatesToQueue:self.operationQueue updateOn:1.0 withHandler:^(NSInteger numberOfSteps, NSDate *timestamp, NSError *error){
if(!error){
// do something with numberOfSteps
} else {
// not authorized: CMErrorDomain code 105
}
}];
}
[self.cmStepCounter queryStepCountStartingFrom:dayStart to:dayEnd toQueue:_operationQueue withHandler:^(NSInteger numberOfSteps, NSError *error) {
if(!error){
// do something with numberOfSteps
} else {
// not authorized: CMErrorDomain code 105
}
}];
最佳答案
通过检查错误,您正在正确地执行此操作。根据文档 ( https://developer.apple.com/library/ios/documentation/coremotion/reference/cmmotionmanager_class/index.html#//apple_ref/c/tdef/CMError ),您将收到错误代码为 105 的 CMErrors,如您所见。
遗憾的是,无法提前检查您是否已获得授权,但这遵循了 Apple 的范例以及其他需要授权的核心级框架,例如 CoreLocation。原因是你可以在后台获取运动步骤,然后用户可以禁用你的运动访问,你必须以可能与不被访问的方式相同的方式对该事件使用react首先获得授权。
关于ios - m7/m8 检测运动事件授权是否被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26849983/