1

我以多种方式使用 M7/M8 芯片的 MotionActivity,包括计步。对于计步,我既查询当天的步数,又在实时发生时不断请求步数。

目前,在执行此操作之前,我会先检查[CMStepCounter isStepCountingAvailable]以及本地覆盖标志,然后再继续执行此代码。我假设 isStepCountingAvailable 如果未授予 motionActivity 授权,将返回 FALSE。情况似乎并非如此,它似乎更像是一种硬件检测。我似乎找不到其他方法来检测是否为此授予了授权。

这意味着 startStepCountingUpdatesToQueue 和 queryStepCountStartingFrom 都运行并返回块,但总是返回错误代码。特别是 CMErrorDomain 代码 105。

有没有更好的方法来确定motionActivity 是否未经授权?我有一些后备代码,但我更喜欢事先进行布尔检查,而不是返回块中的错误代码。

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
    }
}];
4

1 回答 1

1

通过检查错误,您正确地做到了。根据文档(https://developer.apple.com/library/ios/documentation/coremotion/reference/cmmotionmanager_class/index.html#//apple_ref/c/tdef/CMError),您将收到带有错误代码 105 的 CMErrors就像你看到的那样。

不幸的是,没有办法提前检查您是否获得授权,但这遵循 Apple 的范例以及需要授权的其他核心级框架,例如 CoreLocation。原因是您可以在后台获取动作步骤,然后用户可以禁用您的动作访问,您必须以与您对不存在的反应相同的方式对该事件做出反应第一时间授权。

于 2014-11-10T21:56:43.857 回答