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

时间:2014-02-22 00:26:27

标签: ios objective-c core-motion

我无法在后台接收加速计数据,尽管每个问题看似正确的解决方案How Nike+ GPS on iPhone receives accelerometer updates in the background?

[_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];
                                             });}];
只要应用程序位于前台,就会记录

执行,但每当我退出到后台时它都会停止运行。有谁知道为什么会这样?我在背景模式中检查了“位置更新”...

2 个答案:

答案 0 :(得分:6)

将此代码放在该行的前面(在创建名为bibTaskID的成员变量UIBackgroundTaskIdentifier之后):

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

答案 1 :(得分:0)

可以使用CoreMotion框架完成。您必须导入CoreMotion框架,然后导入#import <CoreMotion/CoreMotion.h>中的appdelegate

此处motionManager是CMMotionManager的对象。

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的这些值,即使在后台也是如此。