[解決済み] iOSのバックグラウンドでの定期的な位置情報更新
質問
バックグラウンドでの位置情報の更新が必要なアプリケーションを書いています。 高精度かつ低頻度 . 解決策は、バックグラウンドの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% に減少しました。
関連
-
iOS classic error Undefined symbols for architecture XXX:
-
制御が非ボイド関数の終了に達する
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] iPhone 5の画面解像度に対応したアプリを開発・移行するには?
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] Swiftのプロトコルでオプションのメソッドを定義するには?
-
[解決済み】iOSアプリケーションでバックグラウンドの位置情報をn分ごとに更新するにはどうすればいいですか?
-
[解決済み] 重要な変更点のAPIを終了/停止した場合の動作は?