3

ユーザーが静止しているか、歩いているか、走っているか、または交通機関に乗っているかを理解するために、モーションの更新を受信して​​処理できるアプリを作成したいと考えています。CMMotionActivityManager が役立つ可能性があることをリファレンスで見ました。

CMMotionActivityManager クラスは、デバイスによって保存されたモーション データへのアクセスを提供します。モーション データには、ユーザーが一定時間歩いているか、走っているか、車に乗っているか、静止しているかが反映されます。

アプリ開発は初めてで、更新を開始する方法がわかりません。これを行う方法は- (void)startActivityUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMMotionActivityHandler)handler. 参照に次のように書かれているため、ハンドラーに何を書くべきかわかりません。

handler 現在のモーション タイプの変更が検出されたときに実行するブロック。このブロックのパラメーターについては、CMMotionActivityHandler を参照してください。このプロパティは nil であってはなりません。

私の実装は次のとおりです。

- (IBAction)startButtonPressed:(id)sender {
_motionActivityManager = [[CMMotionActivityManager alloc] init];
[_motionActivityManager startActivityUpdatesToQueue:NSOperationQueueDefaultMaxConcurrentOperationCount withHandler:CMMotionActivityHandler];
}

既に CoreMotion フレームワークをインポートしましたが、XCode が を認識しませんCMMotionActivityHandler。どこが間違っているのでしょうか? この問題を解決するにはどうすればよいですか?

ありがとう

4

4 に答える 4

4

この回答の最も投票数の多いバージョンは、少し遠回りです。キューを作成しますが、GCD を使用してメイン キューで実行します。また、多くの例ではパラメーター内にブロックを配置していwithHandlerますが、それはぎこちなく、きれいに見えません (コードのフォーマットの観点から)。

これが私の実装例です:

@implementation MotionHandler {
@private
    // this is a private variable for this class that is not visible outside
    // (also, iOS handles memory and access management of these faster than properties)
    CMMotionActivityManager *_motionActivityManager;
}

// initialization method, you can do other stuff here too
- (instancetype)init {
    self = [super init];
    if (self) {
        // check to see if the device can handle motion activity
        if ([CMMotionActivityManager isActivityAvailable]) {
            // if so, initialize the activity manager
            _motionActivityManager = [[CMMotionActivityManager alloc] init];
        }
    }
}

- (void)startMotionActivityMonitoring {
    // create the motion activity handler
    CMMotionActivityHandler motionActivityHandler = ^(CMMotionActivity *activity) {
         // TODO motion detected here. Do something.
    }

    // check to see if the motion activity manager exists
    if (_motionActivityManager) {
        // if so, start monitoring activity
        // notice that we add updates to the mainQueue. This will call your handler on the main thread
        [_motionActivityManager startActivityUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:motionActivityHandler];
    }
}

@end
于 2015-08-24T23:08:08.070 に答える
4

サンプルコード:

[_motionActivityManager startActivityUpdatesToQueue:[[NSOperationQueue alloc] init]
                                          withHandler:
     ^(CMMotionActivity *activity) {

         dispatch_async(dispatch_get_main_queue(), ^{

             if ([activity walking]) {
                 NSLog(@"walking");
             }
     });
}];
于 2014-01-21T11:01:12.920 に答える
1

スイフト2.0

_motionActivityManager = CMMotionActivityManager()   
_motionActivityManager.startActivityUpdatesToQueue(NSOperationQueue.mainQueue())
{
    // CMMotionActivity
    activity in

    // do your logic here

}
于 2016-01-28T21:58:37.480 に答える
1

//デバイスで利用できるかどうかを確認します

BOOL b=  [CMMotionActivityManager isActivityAvailable];;

motionActivityManager=[[CMMotionActivityManager alloc]init];
//register for coremotion notification

 [motionActivityManager startActivityUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMotionActivity *activity) {

    NSLog(@"Got a core motion update");
    NSLog(@"Current activity date is %f",activity.timestamp);
    NSLog(@"Current activity confidence from a scale of 0 to 2 - 2 being best- is: %ld",activity.confidence);
    NSLog(@"Current activity type is unknown: %i",activity.unknown);
    NSLog(@"Current activity type is stationary: %i",activity.stationary);
    NSLog(@"Current activity type is walking: %i",activity.walking);
    NSLog(@"Current activity type is running: %i",activity.running);
    NSLog(@"Current activity type is cycling: %i",activity.cycling);
    NSLog(@"Current activity type is automotive: %i",activity.automotive);



}];

デバイスで確認してください

于 2015-04-29T09:38:14.417 に答える