iOSアプリケーションに位置情報を追加するにはどうすればいいですか?


最近iOSアプリケーションに位置情報を追加するには、以下のようなニーズが必要です。
  • アプリケーションは、フロントで位置情報を取得することができます。
  • アプリケーションをバックグラウンドに切り替えた場合、位置情報の取得を停止する。
  • アプリケーションは、フロントで動作し、スクリーンを直接ロックすると、位置情報を取得し続けることができる。
  • この三つの需要を逐次実現します。
    デバイスの位置情報を取得する
    iOSで位置情報を取得するのは簡単です。ネット上の資料も多く、私のコードは以下の通りです。
    
    // make sure location service is enabled.
    if (!CLLocationManager.LocationServicesEnabled) {
     return;
    }
    // create a new location manager
    CLLocationManager locationManager = new CLLocationManager {
     DistanceFilter = CLLocationDistance.FilterNone,
     DesiredAccuracy = 1000
    };
    // check to work with both ios 6 and older.
    if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) {
     locationManager.LocationsUpdated += OnLocationsUpdated;
    }
    else {
     locationManager.UpdatedLocation += OnLocationUpdated;
    }
    locationManager.StartUpdatingLocation();
    初めて運行する時、システムは使用する場所を適用するダイアログをポップアップします。クリックして確認すればいいです。
    ロック画面で引き続きGPS情報を更新します。
    プログラムが実行されると、ユーザは直接スクリーンをロックして、アプリDelegateのDidEnterBackground方法を呼び出すが、iOSアプリケーションにとっては、ユーザがプログラムを切り替えるか、またはHomeボタンをクリックするかは、この関数を呼び出すことができ、この2つの操作の違いは、現在のアプリケーションのインスタンスの状態で、ユーザがプログラムを切り替えるか、またはHomeボタンをクリックするときに、アプリケーションの状態はUAppliation Station Backgroundで、スクリーンをロックする時、アプリケーションの状態はUAppliation Station Inactiveで、次のコードを使ってこの二つの状況を区別できます。
    
    public override void DidEnterBackground(UIApplication application) {
     if (application.ApplicationState == UIApplicationState.Background) {
      Log.Debug("App send to background by home button/switching to other app, stop upload location.");
     }
     else if (application.ApplicationState == UIApplicationState.Inactive) {
      Log.Debug("App send to background by locking screen, contine upload location, but change mode to powersave mode");
     }
    }
    スクリーンをロックした状態で位置情報を更新し続ける必要があります。DidEnterBackground関数でアプリケーションの状態をチェックすると、UAppliation Backgroundの状態が更新位置を停止します。コードは以下の通りです。
    
    public override void DidEnterBackground(UIApplication application) {
     // switch to other app or click home button, stop update location
     if (application.ApplicationState == UIApplicationState.Background) {
      locationManager.StopUpdatingLocation();
     }
    }
    注意:Appleの文書によると、DidEnterBackground関数は約5秒の実行時間があります。5秒を超えてもこの関数から戻ってこないと、アプリケーションは異常に終了しますので、この関数の中で時間のかかる操作をしないでください。
    アプリケーションがフロントまたはロック解除に切り替わると、アプリDelegateのWill EnterBackgroundメソッドを呼び出します。この方法で引き続き位置を更新すればいいです。
    
    public override void WillEnterForeground(UIApplication application) {
     // app switch to foreground, continue to update location.
     locationManager.StartUpdatingLocation();
    }
    注意:WillEnterForegroundは約5秒の実行時間がありますので、この関数では時間のかかる操作はしないでください。
    アプリケーションにバックグラウンドの位置権限を追加します。
    本当にスクリーンをロックした状態で位置を更新し続けるには、info.plistを変更し、バックグラウンドの位置権限を追加する必要があります。プロジェクトのinfo.plistファイルを見つけたら、ダブルクリックして開いて、Sourceラベルに切り替えます。

    その後、Required background modes属性項目を追加し、この属性タイプをArayに設定し、この属性にサブ項目Locationn-based informationを追加して、最終的には次の図のようになります。

    直接に下のコードをinfo.plistファイルに追加することもできます。効果は同じです。
    
    <key>UIBackgroundModes</key>
    <array>
     <string>location</string>
    </array>
    以上はiOSアプリケーションに位置情報を追加する方法の詳細です。iOSアプリケーションに位置情報を追加する資料は他の関連記事に注目してください。