1. ホーム
  2. ios

[解決済み] 重要な変更点のAPIを終了/停止した場合の動作は?

2022-11-07 07:08:47

質問

このセクションは CLLocationManager を使ったアプリの動作を説明したドキュメントのセクションです。 startMonitoringSignificantLocationChanges (重要な位置情報の変更) :

このサービスを開始し アプリケーションが終了した場合 終了した場合、システムは自動的に アプリケーションをバックグラウンドで起動します。 バックグラウンドに再立ち上げします。この場合 このような場合、オプション辞書 に渡される に渡されるオプション辞書が使用されます。 メソッドに渡されるオプション辞書には には、キー UIApplicationLaunchOptionsLocationKey が含まれています。 を含んでおり、アプリケーションがロケーションイベントのために起動されたことを示します。 キーが含まれます。 再立ち上げの際にも、次のことが必要です。 ロケーションマネージャーオブジェクトを設定し を設定し、このメソッドを呼び出して、位置情報の受信を継続する必要があります。 を呼び出す必要があります。位置情報サービスを再起動すると 位置情報サービスを再開すると、現在の イベントがデリゲートに配信されます。 に配信されます。また、位置情報マネージャーの プロパティに最新の情報が格納されます。 オブジェクトのロケーションプロパティに、最新の また、ロケーション・マネージャー・オブジェクトのロケーション・プロパティには、ロケーション・サービスを開始する前でも さらに、ロケーションマネージャーオブジェクトのプロパティには、ロケーションサービスを開始する前でも、最新のロケーションオブジェクトが設定されます。

つまり、私の理解では、アプリが終了した場合(そして、もしあなたが stopMonitoringSignificantLocationChanges から アプリケーションの終了 ) で起こされます。 UIApplicationLaunchOptionsLocationKey パラメータを application:didFinishLaunchingWithOptionsのパラメータです。 . この時点で CLLocationManager を作成し 開始MonitoringSignificantLocationChanges で、バックグラウンドで位置情報を処理し 期間限定 . だから、この部分は大丈夫です。

前の段落は、アプリが終了したときのことについてだけ述べており、アプリが中断されたときにどうするかについては触れていません。 のドキュメントでは didFinishLaunchingWithOptions のドキュメントを参照してください。 にはこう書かれています。

このアプリケーションはバックグラウンドで位置情報 の更新をバックグラウンドで追跡していましたが、パージされました。 現在では再始動しています。この場合 この場合、辞書には、アプリケーションがパージされたことを示すキー が含まれており、アプリケーションは この場合、辞書には、アプリケーションが新しい場所 イベントのために再起動されたことを示すキーが含まれています。

終了した後、アプリが(ロケーション変更のために)起動されたときにのみ、この呼び出しを受けることを示唆します。

の段落は、しかし 重要な変更サービス の中にある 位置認識プログラミングガイド には、次のように書かれています。

このサービスを実行したままにしておくと アプリケーションが停止または終了した場合 アプリケーションが停止または終了した場合、このサービスは が自動的に起動します。 新しい位置情報が到着すると、自動的にアプリケーションを起動します。 を自動的に起動します。ウェイクアップ時に、アプリケーションは アプリケーションはバックグラウンドに移行し バックグラウンドに移行し、位置情報を処理するためのわずかな時間が 処理するためにわずかな時間が与えられます。このため アプリケーションはバックグラウンドにあるため アプリケーションはバックグラウンドなので、最小限の作業しか行わず ネットワークへの問い合わせなど ネットワークへの問い合わせなど を避ける必要があります。 を避ける必要があります。そうしないと アプリケーションは終了する可能性があります。

これは、アプリが停止している場合、位置情報で起こされることを示唆していますが、どのように起こされるのかについては言及していません。

これを書き上げる過程で、私は自分自身の質問に答えただけかもしれないと思いますが、より詳しい人にこれについての私の理解を確認してもらえるとうれしいです。

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

この質問をした後、私はかなりの量のテストを行い (主に自宅と会社の間の電車の中で)、中断されたアプリの動作が質問の最後に書いたような疑惑であることを確認しました。

つまり、中断されたアプリは起動され、アプリ デリゲートのコールバックを受け取らず、代わりに位置情報の更新を既存の CLLocationManagerDelegate (ロケーション マネージャー デリゲート) . バックグラウンドで動作していることは applicationState を確認し、サスペンド状態から起こされて位置処理を行う場合のために、限定的な作業を行います。

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

私はこの結論に至るまでに、ロケーションテストハーネスを作成しました。 ダウンロード をダウンロードして試してみてください。 これは非常にシンプルなアプリで、UI を通じて重要な変更と GPS 変更の API をオンにして、戻ってくるすべての応答を記録することができます。

N.B. 前の回答のポイント6は正しくありません。 フリーズドライ サスペンドされたアプリは CLLocationManagerDelegateを使用します。 コールバックを受け取ります。