blog

iPhoneでCoreLocation その1~位置情報取得~

2011.02.14

デバイスソリューション部 モバイルソフトウェアデザイングループの小田です。

今回iPhoneアプリの開発を行ってきた中でよく使用するCoreLocationを使用した位置情報の取得方法について紹介します。

説明にあたり、取得位置の表示とボタンを押してmapsアプリで取得位置を中心とした地図を表示するアプリを作成します。

・Xcodeの新規作成でView-Based Applicationのプロジェクト(今回プロジェクト名はLocationとしました)を作成したら、CoreLocation.framworkをプロジェクトに追加しましょう。





・Interface BuilderでLocationViewController.xibのレイアウトを次のように配置します。

・LocationViewController.hはこんな感じです。

CoreLocationでは主にCLLocationManagerクラスとCLLocationManagerDelegateプロトコルを使用します。
LocationViewController.xibにアウトレットとアクションを接続しましょう。

・viewDidLoadでロケーションマネージャーを作成します。

現在使用しているデバイスが、位置情報サービスを許可しているかを判断して許可されていたらdelegateを設定して位置情報の取得を開始します。

locationServicesEnabledプロパティはiOS4.0以降非推奨なのでクラスメソッドのlocationServicesEnabledを使うようにします。

ただ、iOS4.0以前の場合はクラスメソッドが使用できないのでrespondsToSelector:で判断してlocationServicesEnabledプロパティとクラスメソッドを使い分けるようにしましょう。

※locationServicesEnabledではデバイスの設定だけでアプリ単位の設定は判別できません。アプリ単位の判別については後で説明します。

・CLLocationManagerDelegateを実装します。
今回使用するCLLocationManagerDelegateプロトコルのメソッドは下記の2つです。

それでは実装を見てみましょう。

位置情報が取得できた場合にこのメソッドが呼ばれます。newLocationが今回取得した位置情報、(今回は使用していませんが)oldLocationが前回取得した位置情報です。

※startUpdatingLocationで位置情報の取得を開始するとstopUpdatingLocationで取得を停止するまで位置情報が取得されるたびにこのメソッドが呼ばれます。位置情報の取得が1度でいい場合はこのメソッドでstopUpdatingLocationを呼ぶようにしましょう。

このメソッドは位置情報の取得に失敗した場合に呼ばれるので、ここでアラート表示等のエラー処理を行います。先ほどアプリ単位の位置情報サービスはlocationServicesEnabledで判別できないと書きましたが、このメソッドの引数errorのエラーコードがkCLErrorDeniedのとき、初めてこのアプリの位置情報サービスが許可されていないと判ります。

位置情報サービスが許可されていない場合は位置情報を取得する必要がないのでstopUpdatingLocationで取得を停止しましょう。

・アクションメソッド(launchMapsApp)を実装する。

openURL:を使用してmapsアプリを起動します。パラメータqに取得した位置情報を使用することで現在位置をmapsアプリで表示できます。

これで完成です。早速iPhoneで起動してみましょう。
※今回はブライトシステムの社内で起動しています。

アラートが出てきました、これはアプリをインストール後、初めてCoreLocationのサービスが使用されるタイミングでシステムが表示します。今回はOKを選択します。

経度と緯度が取得できましたね。

この位置をmapsアプリで表示してみましょう。「mapsアプリで表示ボタン」をタップしてmapsアプリを起動します。

誤差はありますが、ブライトシステムの会社の位置付近にピンが刺さりました。

今回はCoreLocationを使用してiPhoneで位置情報を取得する方法を紹介しました。
地図で位置を表示する以外にも、取得したリストを現在地から近い順に並べたり、現在地から○kmの範囲のものを表示させたりといろいろなことに使うことができます。