3

我想创建一个可以接收和处理运动更新的应用程序,以了解用户是静止的、步行的、跑步的还是在交通工具上。我在参考资料中看到 CMMotionActivityManager 对我有用。

CMMotionActivityManager 类提供对设备存储的运动数据的访问。运动数据反映用户是在步行、跑步、在车辆中还是静止一段时间。

我是应用程序开发的新手,我不明白如何使用开始更新的方法。这样做的方法是- (void)startActivityUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMMotionActivityHandler)handler。我不明白我应该在处理程序上写什么,因为参考资料说:

handler 检测到当前运动类型发生变化时执行的块。有关此块的参数的信息,请参阅 CMMotionActivityHandler。该属性不能为零。

我的实现是:

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

我已经导入了 CoreMotion 框架但是 XCode 不识别CMMotionActivityHandler,我哪里错了?我该如何解决这个问题?

谢谢

4

4 回答 4

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 回答
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 回答
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 回答
1

斯威夫特 2.0

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

    // do your logic here

}
于 2016-01-28T21:58:37.480 回答