【Swift】端末の位置情報を利用するための準備。(Swift 2.1、XCode 7.2)

2020年6月16日

GPSを内蔵している端末は位置情報を利用できる

GPSを内蔵しているiPhoneやiPadがあれば、ソースコードで端末の位置情報を利用することができる。目的地以外でピンを刺したい場所といえば現在地だ。

そこで、本記事では、端末の位置情報を利用するための準備について説明する。

 

位置情報を利用するための準備

位置情報を利用するには、プロジェクト内で共通に使うプロパティリスト(info.plist)にプロパティを追加しておく必要がある。

下図赤枠のinfo.plistをクリックしてプロパティ一覧を表示する。一覧にマウスカーソルを持っていくと下図黄緑枠の「+」ボタンが表示されるので押す(どこの行の「+」ボタンでも良い)。

info.plstにプロパティを追加する

 

そして、以下の2つのいずれか、または両方の設定を追加する。1つ目はアプリを使っているときのみ位置情報を利用する場合に設定し、2つ目はアプリがバックグラウンドの状態でも位置情報を利用し続ける場合に設定する。

Key Type Value
1 NSLocationWhenInUseUsageDescription String 理由(例、端末の位置を常に地図に表示するために位置情報を利用します。)
2 NSLocationAlwaysUsageDescription String 理由(例、端末の位置を常に地図に表示するために位置情報を利用します。)

 

位置情報サービスのON、OFFを確認する

アプリが端末の位置情報を取得するには、位置情報サービスがONになっていて、かつ、位置情報の利用をユーザーに許可してもらう必要がある。

位置情報サービスのON、OFFは、設定⇒「プライバシー」⇒「位置情報サービス」で確認できる。スイッチをONにすると位置情報サービスを利用すことになり、スイッチをOFFにするとすべてのアプリが位置情報を利用できなくなる。

位置情報サービス

 

ソースコードから位置情報サービスのON、OFFを確認するには以下のメソッドを呼び出す。trueの場合は利用可能、falseの場合は利用不可。

 

アプリインストール後の初回起動で、位置情報を使おうとしたときに位置情報サービスがOFFだった場合、下図のような、設定変更を促す画面が表示される。ただし、二回目以降は表示されない。

位置情報を利用できるようにするには位置情報サービスをオンにしてください

位置情報の利用許可を確認する

アプリ個別の位置情報の利用許可状況を確認するには、「設定」⇒「プライバシー」⇒「位置情報サービス」⇒アプリ名で確認する。先ほどinfo.plistに追加した項目がここに表示される。下図は「常に許可」に設定されている。

位置情報の許可を「常に許可」に設定

 

ソースコードからこの設定を確認するには以下のメソッドを呼び出す。設定状況に応じで5つのステータスのいずれかが戻ってくる。

 

下表は5つのステータスと設定内容。

ステータス 説明
1 CLAuthorizationStatus.NotDetermined まだ設定していない。
2 CLAuthorizationStatus.Restricted 「設定」⇒「一般」⇒「機能制限」で、位置情報サービスの利用が制限されている。
3 CLAuthorizationStatus.Denied 「許可しない」に設定されている。
4 CLAuthorizationStatus.AuthorizedWhenInUse 「このAppの使用中のみ許可」に設定されている。
5 CLAuthorizationStatus.AuthorizedAlways 「常に許可」に設定されている。

 

ステータスがCLAuthorizationStatus.NotDetermined(未設定)のときに以下のメソッドを呼び出すと、設定を変更する画面をポップアップ表示することができる。(testManagerはCLLocationManagerクラスのインスタンス)

 

下図はrequestWhenInUseAuthorizationメソッドを呼んだ結果。

使用中に位置情報の利用を許可しますか?

 

下図はrequestAlwaysAuthorizationメソッドを呼んだ結果。このメッセージを呼んだユーザーは、アプリが停止しても位置情報が取得され続けると誤解してしまいそうだ。

使用していないときでも位置情報の利用を許可しますか

 

一方、ステータスがCLAuthorizationStatus.NotDetermined(未設定)以外のときに上記のメソッドを呼んでも何も表示されない。これは、設定したにも関わらずアプリを起動するたびに許可を促されるのを防止するためと考えられる。

しかし、「許可しない」や「機能制限」で位置情報が取得できないままだとアプリとして成り立たない場合は、起動するたびに設定変更を促すしかない。

そこで、位置情報サービスのON、OFF利用許可のステータスに応じて、以下のコードのように処理を分けるのが良い。

ちなみにViewDidLoadメソッドのプロセスからpresentViewControllerメソッドを呼び出すとエラーが発生するので、画面が表示された直後に呼び出されるviewDidAppearメソッドの中で処理を記述している。

 

次回記事は、位置情報サービスを利用して地図上の現在位置にピンを刺す方法を説明する。