使用CoreMotion框架在后台接收加速度计更新

时间:2014-01-27 12:23:10

标签: ios objective-c accelerometer core-motion

我正在使用以下代码获取加速度计数据(使用CoreMotion框架):

CMMotionManager *motionManager = [[CMMotionManager alloc] init];    
motionManager.accelerometerUpdateInterval = 1.0 / 60.0;
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
                                                 withHandler:^(CMAccelerometerData  *accelerometerData, NSError *error) {
                                                 NSLog(@"ACCELEROMETER DATA = %@",accelerometerData);
                                                 }];

当应用程序处于前台模式时,我正在接收日志,但当它进入后台时,我只会在应用程序中的音乐播放时收到日志。 我已将以下内容添加到app info plist文件中:

- Required background modes
   - App registers for location updates
   - App plays audio or streams audio/video using AirPlay

问题是:当音乐没有播放时,如何在后台接收加速度计更新?

2 个答案:

答案 0 :(得分:6)

您不仅可以使用加速度计从背景中获取数据,

正如您所说的App registers for location updates,请在前台启动位置管理器。

实施长时间运行的后台任务

对于需要更多执行时间来实现的任务,您必须请求特定权限才能在后台运行它们而不会被暂停。在iOS中,只允许特定的应用类型在后台运行:

  1. 在后台播放用户可听内容的应用,例如音乐播放器应用
  2. 在后台录制音频内容的应用。
  3. 随时向用户通知其位置信息的应用,例如导航应用
  4. 支持互联网协议语音(VoIP)的应用
  5. 需要定期下载和处理新内容的应用
  6. 从外部附件接收定期更新的应用

答案 1 :(得分:-1)

你的AppDelegate.m

中的

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data,     invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    UIApplication* app = [UIApplication sharedApplication];

    __block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
}