使用CoreMotion在后台获取加速计数据

我无法在后台接收加速计数据,尽pipe每个问题看似正确的解决schemeiPhone上的Nike + GPS如何在后台接收加速计更新?

[_motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"perform"); [(id) self setAcceleration:accelerometerData.acceleration]; [self performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:NO]; });}]; 

每当应用程序在前台时执行都会被logging下来,但是每当我退出到后台时它都会停止运行。 有没有人有任何想法,为什么这可能是? 我在背景模式中检查了“位置更新”…

将该代码放在该行的前面(在创build一个名为bgTaskID的UIBackgroundTaskIdentifiertypes的成员variables之后):

 UIApplication *application = [UIApplication sharedApplication]; __weak __typeof(&*self)weakSelf = self; self.bgTaskID = [application beginBackgroundTaskWithExpirationHandler:^{ __strong __typeof(&*weakSelf)strongSelf = weakSelf; NSLog(@"BG TASK EXPIRED!"); if (strongSelf) { [application endBackgroundTask:strongSelf.bgTaskID]; strongSelf.bgTaskID = UIBackgroundTaskInvalid; } }]; 

它可以通过使用CoreMotion框架来完成。 您必须导入CoreMotion框架,然后在您的appdelegateinput#import <CoreMotion/CoreMotion.h>

这里motionManager是CMMotionManager的对象。

xData, yData, zData是用于存储加速度计数据的双xData, yData, zData值。

 if (motionManager ==nil) { motionManager= [[CMMotionManager alloc]init]; } [motionManager startAccelerometerUpdates]; [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { xData = accelerometerData.acceleration.x; yData = accelerometerData.acceleration.y; zData = accelerometerData.acceleration.z; }]; 

您必须在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

然后,您可以使用这些值的xData, yData, zData任何你想要的appdelegate对象,即使在后台。