[解決済み] 重要な変更点のAPIを終了/停止した場合の動作は?
質問
このセクションは CLLocationManager を使ったアプリの動作を説明したドキュメントのセクションです。 startMonitoringSignificantLocationChanges (重要な位置情報の変更) :
このサービスを開始し アプリケーションが終了した場合 終了した場合、システムは自動的に アプリケーションをバックグラウンドで起動します。 バックグラウンドに再立ち上げします。この場合 このような場合、オプション辞書 に渡される に渡されるオプション辞書が使用されます。 メソッドに渡されるオプション辞書には には、キー UIApplicationLaunchOptionsLocationKey が含まれています。 を含んでおり、アプリケーションがロケーションイベントのために起動されたことを示します。 キーが含まれます。 再立ち上げの際にも、次のことが必要です。 ロケーションマネージャーオブジェクトを設定し を設定し、このメソッドを呼び出して、位置情報の受信を継続する必要があります。 を呼び出す必要があります。位置情報サービスを再起動すると 位置情報サービスを再開すると、現在の イベントがデリゲートに配信されます。 に配信されます。また、位置情報マネージャーの プロパティに最新の情報が格納されます。 オブジェクトのロケーションプロパティに、最新の また、ロケーション・マネージャー・オブジェクトのロケーション・プロパティには、ロケーション・サービスを開始する前でも さらに、ロケーションマネージャーオブジェクトのプロパティには、ロケーションサービスを開始する前でも、最新のロケーションオブジェクトが設定されます。
つまり、私の理解では、アプリが終了した場合(そして、もしあなたが stopMonitoringSignificantLocationChanges から アプリケーションの終了 ) で起こされます。 UIApplicationLaunchOptionsLocationKey パラメータを application:didFinishLaunchingWithOptionsのパラメータです。 . この時点で CLLocationManager を作成し 開始MonitoringSignificantLocationChanges で、バックグラウンドで位置情報を処理し 期間限定 . だから、この部分は大丈夫です。
前の段落は、アプリが終了したときのことについてだけ述べており、アプリが中断されたときにどうするかについては触れていません。 のドキュメントでは didFinishLaunchingWithOptions のドキュメントを参照してください。 にはこう書かれています。
このアプリケーションはバックグラウンドで位置情報 の更新をバックグラウンドで追跡していましたが、パージされました。 現在では再始動しています。この場合 この場合、辞書には、アプリケーションがパージされたことを示すキー が含まれており、アプリケーションは この場合、辞書には、アプリケーションが新しい場所 イベントのために再起動されたことを示すキーが含まれています。
終了した後、アプリが(ロケーション変更のために)起動されたときにのみ、この呼び出しを受けることを示唆します。
の段落は、しかし 重要な変更サービス の中にある 位置認識プログラミングガイド には、次のように書かれています。
このサービスを実行したままにしておくと アプリケーションが停止または終了した場合 アプリケーションが停止または終了した場合、このサービスは が自動的に起動します。 新しい位置情報が到着すると、自動的にアプリケーションを起動します。 を自動的に起動します。ウェイクアップ時に、アプリケーションは アプリケーションはバックグラウンドに移行し バックグラウンドに移行し、位置情報を処理するためのわずかな時間が 処理するためにわずかな時間が与えられます。このため アプリケーションはバックグラウンドにあるため アプリケーションはバックグラウンドなので、最小限の作業しか行わず ネットワークへの問い合わせなど ネットワークへの問い合わせなど を避ける必要があります。 を避ける必要があります。そうしないと アプリケーションは終了する可能性があります。
これは、アプリが停止している場合、位置情報で起こされることを示唆していますが、どのように起こされるのかについては言及していません。
- は UIApplicationDelegate は、サスペンド状態からバックグラウンド状態へレジュームしていることを伝えるコールバックを取得するのでしょうか?
- アプリがサスペンドされたときにフリーズドライされた)ロケーション マネージャーは、次のものを受け取り始めるのでしょうか? locationManager:didUpdateToLocation:fromLocationを受信するようになりますか? のコールバックを受信し始めましたか?
- のコードを実装すればよいのでしょうか? にコードを実装するだけでよいのでしょうか? メッセージに、アプリケーションの状態をチェックし、バックグラウンドモードであれば最小限の処理を行うコードを実装すればよいのでしょうか?
これを書き上げる過程で、私は自分自身の質問に答えただけかもしれないと思いますが、より詳しい人にこれについての私の理解を確認してもらえるとうれしいです。
どのように解決するのですか?
この質問をした後、私はかなりの量のテストを行い (主に自宅と会社の間の電車の中で)、中断されたアプリの動作が質問の最後に書いたような疑惑であることを確認しました。
つまり、中断されたアプリは起動され、アプリ デリゲートのコールバックを受け取らず、代わりに位置情報の更新を既存の CLLocationManagerDelegate (ロケーション マネージャー デリゲート) . バックグラウンドで動作していることは applicationState を確認し、サスペンド状態から起こされて位置処理を行う場合のために、限定的な作業を行います。
[UIApplication sharedApplication].applicationState == UIApplicationStateBackground
私はこの結論に至るまでに、ロケーションテストハーネスを作成しました。 ダウンロード をダウンロードして試してみてください。 これは非常にシンプルなアプリで、UI を通じて重要な変更と GPS 変更の API をオンにして、戻ってくるすべての応答を記録することができます。
N.B. 前の回答のポイント6は正しくありません。 フリーズドライ サスペンドされたアプリは CLLocationManagerDelegateを使用します。 コールバックを受け取ります。
関連
-
libc++abi.dylib が NSException 型の捕捉できない例外で終了する理由 エラー
-
dyld: ライブラリがロードされていません。エラーの解決
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] UITextViewのサイズをコンテンツに合わせるには?
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] 16進カラーバリューの使用方法
-
[解決済み] ぼかしの入ったオーバーレイビューの作成
最新
-
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]コンパイルエラー:ld: アーキテクチャ x86_64 のシンボルが見つかりません。
-
iOS classic error Undefined symbols for architecture XXX:
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] UITableViewCell、スワイプ時に削除ボタンを表示させる
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] iOS 13でダークモードをオプトアウトすることは可能ですか?
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?