地図×モバイル アプリ開発③ ~ネイティブ アプリ開発編~

Document created by yuki_ozawaesrij-esridist Employee on Jul 22, 2016Last modified by masanobu_hiranoesrij-esridist on Aug 8, 2016
Version 1Show Document
  • View in full screen mode

map.png

 

「地図×モバイル アプリ開発」シリーズ第3弾のネイティブ アプリ開発編です。

 

第1弾「何を選びますか? 開発方法の選択肢」では、モバイル向けの地図アプリを開発する際に、Web アプリとネイティブ アプリの違いを説明しました。

第3弾ではネイティブ アプリに焦点を当てて紹介します。

まだ読んでいない方は、第1弾の記事「何を選びますか? 開発方法の選択肢」もぜひ読んでみてくださいね。

第1弾の記事で理解していただいたように、ネイティブ アプリは Web アプリと比較して、モバイル端末の機能とより密に連携したい場合に優位です。本稿では、ネイティブ アプリの特長の一つであるバックグラウンド処理と、ArcGIS のモバイル SDK を使用したオフライン地図アプリ開発について紹介します。

 

 

ArcGIS Runtime SDK

 

ネイティブ アプリ開発のためのモバイル SDK として ArcGIS Runtime SDK を提供しています。

ArcGIS Runtime SDK は iOS, Android, .NET 用の SDK を使用して、モバイル端末の機能と連携した地図アプリを効率的に開発できます。

特に ArcGIS の開発キットの場合、端末のローカルに地図データを保存して、オフライン環境でも地図を閲覧したり編集したりできる機能が標準で用意されているのは、ネイティブ アプリ開発のための ArcGIS Rntime SDK だけです。

 

 

 

モバイル アプリのバックグラウンド処理

 

ネイティブ アプリは、アプリがバックグラウンド状態でも処理を続けることができます。

オフライン地図アプリでも、サイズの大きい地図データをダウンロードする際に、ユーザーがアプリを終了しても、バックグラウンド状態でダウンロード処理を継続するための機能が必要となるかもしれませんね。

 

例えば iOS の場合だと、ユーザーがアプリを終了して一定時間が経つと、通常アプリはバックグラウンド状態に入り、処理が停止します。ただし、バックグラウンド状態でも特定の処理を実行できるように、iOS にはいくつかの機能が用意されています。

その中から今回は、 Background Fetch と NSURLSession について紹介します。

 

 

Background Fetch

Background Fetch はアプリがバックグランウンド状態でも不定期にアプリを呼び出し、一時的に処理を実行できる機能です。
例えば、サーバーにリクエストを送り、その処理状況をバックグランウンド状態でアプリからチェックするような機能を実装できます。
以下は Background Fetch の実装方法です。

 

  1. Xcode プロジェクトの [Capabilities] タブで、[Background Modes] の [Background fetch] をチェックして、機能を有効にします。

     

     

  2. アプリの起動後(application:didFinishLaunchingWithOptions: メソッド等)に、Background Fetch のインターバル(アプリを呼び出す間隔)を設定します。

     

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {       
           application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
           return true
    }
    

     

    インターバルは OS によって決められます。UIApplicationBackgroundFetchIntervalMinimum はインターバルを最小にするための設定です。

     

  3. application:performFetchWithCompletionHandler: メソッドを実装します。Background Fetch が実行されると、performFetchWithCompletionHandler が呼ばれるので、ここでサーバーの処理状況等を確認します。

     

    func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
            // 処理を実装
    }
    

 

 

NSURLSession

NSURLSession は、バックグラウンド状態でデータのダウンロードが行えるクラスです。大きなサイズのデータをダウンロードする際に便利です。また、ダウンロード完了時にバックグラウンド状態からアプリを呼び出せるため、ダウンロードの完了をアプリに通知することもできます。

 

  1. バックグラウンド状態でデータのダウンロードを行うためには、backgroundSessionConfigurationWithIdentifier メソッドで NSURLSessionConfiguration を作成します。システム側でセッションの判定に使用されるため、引数にはユニークな値を指定します。

     

    let sessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(“Identifier")
    
    

     

  2. 作成した NSURLSessionConfiguration を使用して NSURLSession を作成します。URL を指定して NSURLSessionDownloadTask を作成し、resume メソッドでダウンロードを開始します。

     

    let session = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil)
    let downloadUrl = NSURL(string: "ダウンロードするデータの URL");
    let downloadTask = session.downloadTaskWithURL("downloadUrl")
    downloadTask.resume()
    
    

     

  3. ダウンロードしたデータは URLSession:downloadTask:didFinishDownloadingToURL メソッドで取得できます。また、バックグラウンド状態でデータをダウンロードする場合は、application:handleEventsForBackgroundURLSession:completionHandler: メソッドを実装する必要があります。

     

    func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
            // 処理の完了を通知
    }
    
    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
            let downloadedData = NSData(contentsOfURL: location)
     }
    

 

 

ご存じの方も多かったかもしれませんが、Background Fetch と NSURLSession について簡単に紹介しました。

ArcGIS Runtime SDK で提供されるオフライン機能も、これらの iOS のバックグラウンド機能と連携して使用できます。

 

 

 

地図データのダウンロード機能

 

ニーズの多いオフラインでの地図利用。この第3弾を読んでくださっている皆さんもモバイルのオフライン地図アプリをご検討されているのではないでしょうか?

ArcGIS Runtime SDK では、クラウド上に公開された地図サービスから必要な範囲のデータをダウンロードして、オフライン環境で地図を表示できます。

開発者アカウントを作成すれば、どなたでもデータをダウンロードしてアプリで利用することができます(ダウンロードしたデータ量による課金等はありませんが、一度のリクエストでダウンロード可能なデータサイズに制限があります)。

以下は地図データをダウンロードするための ArcGIS Runtime SDK for iOS のコードです。データの範囲とスケール、データの保存先等を指定して、地図データをダウンロードします。

 

// ダウンロードする地図データのスケールの詳細レベルと範囲(現在表示している範囲)を設定
let params = AGSExportTileCacheParams(levelsOfDetail: [19, 20, 21], areaOfInterest:self.mapView.visibleAreaEnvelope)
// 地図データのダウンロード先を設定
let path = NSHomeDirectory() + “/Documents"

// 地図データをダウンロード
self.exportTileCacheTask.exportTileCacheWithParameters(params, downloadFolderPath: path, useExisting: false, status: { (status, userInfo) -> Void in
     ……
}) { (localTiledLayer, error) -> Void in
     if error != nil {
          // ダウンロードのエラー表示
          UIAlertView(title: "エラー", message: error.description, delegate: nil, cancelButtonTitle: "OK").show()
     } else {
          // ダウンロードしたデータを地図ビューに追加
          self.mapView.addMapLayer(localTiledLayer, withName:"offline map"
     }

}

 

上記コードで使用している exportTileCacheTask を実行すると、サーバー側でタイルのパッケージ ファイルが作成されます。パッケージ ファイルが作成されると、自動でファイルのダウンロードが開始されます。これら一連の処理をバックグラウンド状態でも実行できるように、先述した Background Fetch や NSURLSession と組み合わせて地図データのダウンロード機能を開発できます。

 

サンプルを動かしてみよう!

地図データをダウンロードして利用する iOS のサンプル コード(arcgis-samples-ios/swift/ArcGISSample/ExportTilesViewController.swift)を GitHub に公開しています。

実際にアプリを動かして、ダウンロード機能とその実装方法を確認してみてください!

 

offline_map.gif

 

※サンプルを実行するには、開発者向けクラウドサービス(ArcGIS for Developers)の無償アカウントと ArcGIS Runtime SDK for iOS のインストールが必要です。

詳細は以下のリンクをご覧ください。

 

ArcGIS Runtime SDK では、地図データをダウンロードして表示する方法に加えて、予め地図データをアプリにコピーしておき、オフライン環境で表示する機能も用意されています。また、地図表示以外にも・住所検索・ルート検索・編集等の地図アプリ開発に欠かせない機能を網羅しています。それらの機能を組み合わせることで要件に応じた柔軟なオフライン地図アプリを開発可能です。

オフライン機能の詳細は ESRIジャパン Web ページ(iOS/Android/.NET)をご覧ください。

 

runtime_sdk.png

 

ArcGIS Runtime SDK には、今回紹介した機能以外にも、GPS やセンサーと連携したナビゲーション機能、カメラ等と連携したデータ編集機能等、ネイティブ アプリならではの機能が用意されています。

ご興味のある方は、ぜひ開発者向けクラウドサービス(ArcGIS for Developers)のアカウントを作成して、評価してみてください。アプリの評価・開発は無償で行えます。

開発リソース集にてアカウントの作成からアプリ作成までの簡単な手順を紹介していますので、あわせてご覧ください。

 

次回の「地図×モバイル アプリ開発」シリーズ記事は、第4弾の「ハイブリッド アプリ開発編」です!

 

■関連リンク

1 person found this helpful

Attachments

    Outcomes