高精度かつ低頻度でバックグラウンドでの位置情報の更新を必要とするアプリケーションを書いています。解決策は、Location Managerの更新を開始してすぐにシャットダウンするバックグラウンドNSTimerタスクのようです。この質問は以前に尋ねられています:
iOSアプリケーションでn分ごとにバックグラウンドで位置情報を更新するにはどうすればよいですか?
アプリがバックグラウンドに移行した後、n分ごとにユーザーの場所を取得する
iOS典型的なバックグラウンド位置追跡タイマーの問題ではない
「場所」バックグラウンドモードを備えたiOS長時間実行バックグラウンドタイマー
しかし、私はまだ最低限の例を機能させる必要があります。上記の受け入れられた答えのすべての順列を試した後、私は出発点をまとめました。背景に入る:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"ending background task");
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
self.timer = [NSTimer scheduledTimerWithTimeInterval:60
target:self.locationManager
selector:@selector(startUpdatingLocation)
userInfo:nil
repeats:YES];
}
デリゲートメソッド:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", newLocation);
NSLog(@"background time: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
[self.locationManager stopUpdatingLocation];
}
現在の動作は、backgroundTimeRemaining
180秒からゼロにデクリメント(場所のログ記録中)してから、期限切れハンドラーが実行され、それ以上の場所の更新は生成されません。バックグラウンドで定期的な位置情報の更新を無期限に受け取るために、上記のコードを変更するにはどうすればよいですか?
更新:私はiOS 7をターゲットにしており、バックグラウンドタスクの動作が異なるといういくつかの証拠があります: