2016-10-30 105 views
0

我的應用程序收集位置和加速度計信息,並且如果用戶請求它,它將在後臺繼續執行此操作。加速度計信息以大約100 Hz的速度收集,並且以高速率收集它至關重要。該應用在iOS版本較舊的版本下運行良好,但在iOS 10下失敗。我正在尋找一種方法在後臺繼續收集加速度計信息。iOS 10下的背景中的位置和加速計更新

使用的方法與Receive accelerometer updates in background using CoreMotion framework類似。我開始外景經理:

latitude = 0.0; 
longitude = 0.0; 
altitude = 0.0; 
horizontalAccuracy = -1.0; 
verticalAccuracy = -1.0; 
if (locationManager == nil && [CLLocationManager locationServicesEnabled]) { 
    self.locationManager = [[CLLocationManager alloc] init]; 

    CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; 
    if (status == kCLAuthorizationStatusNotDetermined) { 
     [locationManager requestWhenInUseAuthorization]; 
    } 

    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.pausesLocationUpdatesAutomatically = NO; 
    [locationManager startUpdatingLocation]; 
} 

我實現的LocationManager:didUpdateLocations:

- (void) locationManager: (CLLocationManager *) manager didUpdateLocations: (NSArray *) locations { 
    printf("locationManager:didUpdateLocations:\n"); 
    CLLocation *location = locations.lastObject; 
    latitude = location.coordinate.latitude; 
    longitude = location.coordinate.longitude; 
    altitude = location.altitude; 
    horizontalAccuracy = location.horizontalAccuracy; 
    verticalAccuracy = location.verticalAccuracy; 
} 

我開始運動經理:

motionManager = [[CMMotionManager alloc] init]; 
motionManager.accelerometerUpdateInterval = 1.f/trialFrequency; 
[[NSOperationQueue mainQueue] setMaxConcurrentOperationCount: 10]; 
[motionManager startAccelerometerUpdatesToQueue: [NSOperationQueue mainQueue] 
            withHandler: ^(CMAccelerometerData *accelerometerData, NSError *error) { 
             // Flag any error. 
             if (error) { 
              NSLog(@"error getting accelerometer update: %@", error); 
             } 
             <<<process data>>> 
            } 
]; 

目標,能力,背景模式,位置更新檢查。

下的iOS 9和以前,運動信息被記錄在100Hz附近,沒有問題的速率,但iOS的10下,運動信息,只要該應用程序進入背景停止。

有什麼辦法讓運動信息在iOS 10下的背景中繼續?

+0

我建議提交與蘋果的bug報告。 iOS 10對傳感器的背景使用做出了一些奇怪的改變,這可能就是其中之一。而且,無論如何,如果它在以前工作,你就有合理的用例。 – matt

回答

0

從iOS 9開始,需要一個新的呼叫來啓用位置事件的後臺處理。它可以用來打開和關閉後臺處理,但默認爲關閉,所以必須手動設置,以恢復iOS 8和之前的代碼中的後臺處理。

設立時的位置管理器允許後臺處理加入這一行:

locationManager.allowsBackgroundLocationUpdates = YES;