これは、startMonitoringSignificantLocationChangesを使用したアプリの動作を説明するCLLocationManagerドキュメントのセクションです。
このサービスを開始し、その後アプリケーションが終了した場合、新しいイベントが到着すると、システムは自動的にアプリケーションをバックグラウンドで再起動します。このような場合、アプリケーションデリゲートのapplication:didFinishLaunchingWithOptions:メソッドに渡されるオプションディクショナリには、ロケーションイベントが原因でアプリケーションが起動されたことを示すキーUIApplicationLaunchOptionsLocationKeyが含まれています。再起動時に、ロケーションマネージャオブジェクトを設定し、このメソッドを呼び出してロケーションイベントの受信を継続する必要があります。位置情報サービスを再開すると、現在のイベントがすぐに代理人に配信されます。さらに、ロケーションマネージャオブジェクトのロケーションプロパティには、ロケーションサービスを開始する前でも、最新のロケーションオブジェクトが入力されます。
したがって、私の理解では、アプリが終了した場合(そして、applicationWillTerminateからstopMonitoringSignificantLocationChangesを呼び出さなかった場合)、application :didFinishLaunchingWithOptionsへのUIApplicationLaunchOptionsLocationKeyパラメーターでウェイクアップされます。その時点で、CLLocationManagerを作成し、 startMonitoringSignificantLocationChangesを呼び出して、限られた時間だけバックグラウンドロケーション処理を実行します。だから私はこのビットで大丈夫です。
前の段落では、アプリが終了したときに何が起こるかについてのみ説明しており、アプリケーションが一時停止されたときに何をするかについては示唆していません。didFinishLaunchingWithOptionsのドキュメントには次のように書かれています。
アプリケーションはバックグラウンドで位置の更新を追跡し、パージされ、再起動されました。この場合、ディクショナリには、新しいロケーションイベントが原因でアプリケーションが再起動されたことを示すキーが含まれています。
この呼び出しは、終了後にアプリが起動されたとき(場所が変更されたため)にのみ受信されることを提案します。
ただし、ロケーション認識プログラミングガイドの重要な変更サービスに関する段落には、次のように記載されています。
このサービスを実行したままにして、アプリケーションがその後一時停止または終了した場合、新しい位置データが到着すると、サービスはアプリケーションを自動的にウェイクアップします。ウェイクアップ時に、アプリケーションはバックグラウンドに置かれ、位置データを処理するために少し時間が与えられます。アプリケーションはバックグラウンドにあるため、最小限の作業を実行し、割り当てられた時間が経過する前にアプリケーションが戻るのを妨げる可能性のあるタスク(ネットワークのクエリなど)を回避する必要があります。そうでない場合、アプリケーションが終了する可能性があります。
これは、アプリが一時停止されている場合に位置データで目覚めていることを示していますが、どのように目覚めているのかについては言及していません。
- UIApplicationDelegateは、一時停止状態からバックグラウンド状態に再開していることを通知するコールバックを受け取りますか?
- ロケーションマネージャー(アプリが一時停止されたときにフリーズドライされた)は、locationManager:didUpdateToLocation:fromLocationコールバックの受信を開始しますか?
- アプリケーションの状態をチェックし、バックグラウンドモードの場合は最小限の処理を実行するdidUpdateToLocationメッセージにコードを実装する必要がありますか?
これを書いている過程で、私は自分の質問に答えたばかりかもしれませんが、これについての私の理解をもっと知識のある人に確認してもらうのは素晴らしいことです。