我无法在后台接收加速计数据,尽管每个问题看似正确的解决方案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];
});}];
只要应用程序位于前台,就会记录执行,但每当我退出到后台时它都会停止运行。有谁知道为什么会这样?我在背景模式中检查了“位置更新”...
答案 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
的这些值,即使在后台也是如此。