Ios m7/m8检测运动活动授权是否被拒绝

Ios m7/m8检测运动活动授权是否被拒绝,ios,authorization,apple-m7,Ios,Authorization,Apple M7,我正在以多种方式使用M7/M8芯片的MotionActivity,包括用于步进计数。对于步数计算,我既查询一天的步数,又不断请求实时发生的步数 目前,在执行此操作之前,我先检查[CMStepCounter isStepCountingAvailable],以及本地覆盖标志,然后再继续执行此代码。我假设如果未授予motionActivity的授权,isStepCountingAvailable将返回FALSE。情况似乎并非如此,它似乎只是一种硬件检测。我似乎找不到其他方法来检测是否为此授予了授权

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

目前,在执行此操作之前,我先检查[CMStepCounter isStepCountingAvailable],以及本地覆盖标志,然后再继续执行此代码。我假设如果未授予motionActivity的授权,isStepCountingAvailable将返回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
    }
}];

通过检查错误,您的操作是正确的。根据文档()您将收到返回的CMErrors,错误代码为105,如您所见


不幸的是,没有办法提前检查您是否获得授权,但这遵循了苹果的范例,其他需要授权的核心级框架,如CoreLocation。推理是,你可以在中间获得运动步骤,而在后台,然后用户可以禁用你的运动访问,您必须对该事件做出的反应可能与您对未被授权的反应相同。

最后一部分的次要注意事项:当用户在设置(可能是位置)中禁用MotionActivity授权时,IOS会杀死应用程序的当前实例,并在您下次访问它时重新启动。[CLLocationManager locationServicesEnabled]对于CoreLocation检查,我发现苹果在CoreMotion中没有提供简单的方法非常恼人,正如Miro所说,iOS无论如何都会杀死应用程序,因此“执行中”参数失败。。