1

M7/M8 チップの MotionActivity を、歩数のカウントなど、さまざまな方法で使用しています。歩数のカウントについては、その日の歩数を照会し、リアルタイムで発生する歩数を継続的にリクエストします。

現在、これを行う前に、このコードに進む前に[CMStepCounter isStepCountingAvailable]とローカル オーバーライド フラグを確認しています。motionActivity の承認が付与されていない場合、isStepCountingAvailable は FALSE を返すと想定しました。これは事実ではないようで、ハードウェア検出のみのようです。これに対して承認が付与されたかどうかを検出する他の方法が見つからないようです。

つまり、startStepCountingUpdatesToQueue と queryStepCountStartingFrom の両方が実行され、ブロックが返されますが、常にエラー コードが返されます。特に CMErrorDomain コード 105。

motionActivity が承認されていないかどうかを判断するためのより良い方法はありますか? フォールバック コードはいくつかありますが、return ブロックのエラー コードではなく、事前にブール値チェックを行いたいと思います。

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 が返されます。あなたが見たように。

残念ながら、承認されているかどうかを事前に確認する方法はありませんが、これは、CoreLocation などの承認を必要とする他のコアレベルのフレームワークに関する Apple のパラダイムに従っています。その理由は、バックグラウンドでモーション ステップを取得している最中に、ユーザーがモーション アクセスを無効にできるためです。これは、おそらく、そうでない場合と同じように、そのイベントに反応する必要があります。そもそも認可。

于 2014-11-10T21:56:43.857 に答える