1. ホーム
  2. ios

[解決済み] iOSのバックグラウンドでの定期的な位置情報更新

2023-02-20 05:29:27

質問

バックグラウンドでの位置情報の更新が必要なアプリケーションを書いています。 高精度かつ低頻度 . 解決策は、バックグラウンドの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 をターゲットにしており、バックグラウンドタスクの動作が異なるという証拠がいくつかあるようです。

iOS 7 でバックグラウンド タスクから位置情報マネージャーを起動する

どのように解決するのですか?

どうやら stopUpdatingLocation がバックグラウンド・ウォッチドッグ・タイマーを作動させるものであるようなので、これを didUpdateLocation で置き換えています。

[self.locationManager setDesiredAccuracy:kCLLocationAccuracyThreeKilometers];
[self.locationManager setDistanceFilter:99999];

で、GPSを効果的にパワーダウンしているように見えます。 背景のセレクタ NSTimer は、次のようになります。

- (void) changeAccuracy {
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [self.locationManager setDistanceFilter:kCLDistanceFilterNone];
}

数分おきに高精度な座標を取得するために、定期的に精度を切り替えているだけで、なぜなら locationManager は停止していません。 backgroundTimeRemaining はその最大値のままです。これにより、バッテリーの消費が 1 時間あたり ~10% 減りました (一定の kCLLocationAccuracyBest を使用した場合) から、私のデバイスでは 1 時間あたり ~2% に減少しました。