【问题标题】:How to use CMMotionActivityManager and receive updates?如何使用 CMMotionActivityManager 并接收更新?
【发布时间】:2014-02-10 21:27:06
【问题描述】:

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

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

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

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

我的实现是:

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

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

谢谢

【问题讨论】:

    标签: ios iphone core-motion apple-m7


    【解决方案1】:

    示例代码:

    [_motionActivityManager startActivityUpdatesToQueue:[[NSOperationQueue alloc] init]
                                              withHandler:
         ^(CMMotionActivity *activity) {
    
             dispatch_async(dispatch_get_main_queue(), ^{
    
                 if ([activity walking]) {
                     NSLog(@"walking");
                 }
         });
    }];
    

    【讨论】:

    • 我应该在上面的代码中定义其他内容吗?我使用了你的代码并添加了一些 if 活动,以检查它是否是汽车、正在运行、未知但它不起作用。
    • @mattyahtzee :当然它不会在模拟器上工作。您必须签入设备。
    【解决方案2】:

    //检查设备是否可用

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

    请检查设备

    【讨论】:

      【解决方案3】:

      这个答案的最高投票版本有点迂回。它创建一个队列,然后使用 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
      

      【讨论】:

        【解决方案4】:

        斯威夫特 2.0

        _motionActivityManager = CMMotionActivityManager()   
        _motionActivityManager.startActivityUpdatesToQueue(NSOperationQueue.mainQueue())
        {
            // CMMotionActivity
            activity in
        
            // do your logic here
        
        }
        

        【讨论】:

          猜你喜欢
          • 2013-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-19
          • 2020-11-24
          • 2014-08-04
          • 2023-03-21
          相关资源
          最近更新 更多