高精度で低頻度のバックグラウンド位置更新を必要とするアプリケーションを作成しています。解決策は、ロケーション マネージャーの更新を開始し、すぐにシャットダウンするバックグラウンド NSTimer タスクのようです。この質問は以前に尋ねられました:
iOS アプリケーションで n 分ごとにバックグラウンドで位置情報を更新するにはどうすればよいですか?
アプリがバックグラウンドになった後、n 分ごとにユーザーの位置情報を取得する
iOS 典型的なバックグラウンド位置追跡タイマーの問題ではない
「場所」バックグラウンド モードを使用した 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 秒から 0 まで減少し (場所のログ記録中)、有効期限ハンドラーが実行され、それ以上の場所の更新は生成されません。バックグラウンドで定期的な位置情報の更新を無期限に受信するには、上記のコードをどのように変更すればよいですか?
更新: iOS 7 をターゲットにしていますが、バックグラウンド タスクの動作が異なるという証拠がいくつかあるようです。