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

3

我正在使用以下代码获取加速度计数据(使用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);
                                                 }];

当应用处于前台模式时,我能收到日志信息,但当它进入后台时,只有在应用中播放音乐时才能收到日志。我已将以下内容添加到应用信息的plist文件中:
- Required background modes
   - App registers for location updates
   - App plays audio or streams audio/video using AirPlay

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


您不能这样做,加速度计并不是允许的后台模式之一,只有音乐播放、GPS 更新、VOIP 通话和其他一些模式可以使用。如果您添加了后台模式但未使用它们,我认为这将无法工作。 - jcesarmobile
2个回答

6

您不仅可以使用加速度计从后台获取数据,

当您的应用程序注册位置更新时,在前台启动位置管理器。

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

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

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

这个有文档记录吗? - nr5
2
确实是这样!请参考此链接中的3-1表格:https://developer.apple.com/library/prerelease/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html - Akaino
这似乎是该表的新位置:https://developer.apple.com/documentation/xcode/configuring-background-execution-modes/ - MoralCode

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接