【Swift】位置情報を取得し指定位置かどうかを確認するアプリ

アプリ紹介

こんにちは、チェリオです!

これまではUdemyやBoothで購入した技術書を見ながら勉強を進めていたのですが、だんだんとそれらを組み合わせて「自分が作りたいアプリ」を作れるようになってきたので、AppStoreに出そうと考えているもの以外はブログにアップしていこうと思います。

まだ、無駄なコードが多かったり構造が分かりにくかったりするかもしれませんが、その際は”優しく”指摘してもらえると能力UPが見込めるので嬉しいです。

よろしくお願いします。

 

それで、今回は「位置情報を取得し、指定位置かどうかを判定するアプリ」を作ってみました。
文章だけだと分かりにくいと思うので下の画像にて説明します。

背景が白くて少し分かりにくいかもしれませんが、予め設定しておいた位置の近くにいる際は「近くにポイントがあります」と表示され、近くない場合は「近くにポイントはありません」と表示される仕様になっています。

GETの部分はボタンになっており、こちらを押すと現在の自分の位置情報が基準のポイントへと変更されます。

 

これらの技術は、今後自分が作ろうとしているARアプリに使おうとしている技術であるため、予め予習しておきました。
こちらのページに辿り着いた方は、ぜひ参考にしてみて下さい。

 

位置情報の取得

位置情報の取得はCoreLocationのフレームワークで行います。

そういえば、Target > General > Frameworks の部分って編集しないといけないんでしたっけ?
とりあえず今回は念の為、こちらにもCoreLocationを入れておきました。

CoreLocationをインポートしたら、予めlocationManagerとtimerの定義をしておきます。

また、緯度と経度の変数も宣言しておきます。
今回はlatitudeCalやlongitudeCalといった多分無くてもできる変数が入っているのですが、スマートにする方法がパッと思いつかなかったためこうなってしまいました。
何かいい方法があったら教えて下さい。

ちなみにlatitudeNowとlatitudeBeforeで異なる文字列を入れているのは、後ほど出てくる比較で初期の値が引っかからないようにするためです。

画面上部に出てくるLabelの名前はverificationとしておきました。

 

次にsetupLocationManagerという機能を作っておきました。

まずlocationManagerを初期化しておきます。

次にユーザーに対して、位置情報取得の許可を取ります。
今回は「アプリ使用中のみ許可を得る」ことにするので、インスタンスメソッドrequestWhenInUseAuthorization()を使います。

そして、もし位置情報がONになっていた場合startUpdatingLocation()で位置情報を取得します。

 

一番下にはextensionでCLLocationManagerDelegateを追加しておきます。
ここで、最初に設定した変数に対して取得した緯度、経度のデータを格納しています。

 

一定時間間隔で情報を取得させる

四六時中位置情報を取得し、表示画面を変更しているようでは電池や通信量の消費が激しくなってしまいます。
そのため、今回は5秒おきに位置情報を取得し、表示画面を変更するという機能を付けました。

使ったものはScheduledTimerです。これによりselector部分の機能をtimeIntervalの秒数ごとに呼び出すことができるようになります。
そのため、今回は5秒おきに先程作った機能setupLocationManagerを呼び出すことにしています。

その下には、予めディレクトリに保存しておいた緯度、経度を呼び出し、現在の緯度、経度と比較することでLabelの文字を変える処理を書いています。
位置情報はiPhoneを動かさない場合でも結構ズレが生じてしまうため、ある程度の範囲内であれば反応するようにしておきました。

最後に、アプリ終了後もTimerが動き続けていると端末のメモリ消費が激しくなってしまうため、アプリ終了と同時にTimerを切るようにしています。

 

データを保存する

GETボタンを押した際にデータをディレクトリ内に保存します。今回ボタン名はgetLocationとしておきました。

あとはまぁUserdefaultsで簡単に保存できます。

取り出しは先程も見えていましたが、こんな感じの流れで!

しかし、ここでなぜかString型以外の形で保存しようとするとどうにも上手くいかないため、変な変数が無駄に作られていたというわけです。

もう少し格闘してみますが、何か心当たりがある方いましたら教えて下さい!

 

データ取得の許可申請

どのタイミングでもいいのですが、Info.plidtに位置情報を取得する理由を書かなければなりません。

+ボタンからPrivacy – Location When In Use Usage Descriptionを追加し、Valueの方に取得する理由を記述しておきます。

展望

今回は基本的な機能を備え付けることができたため、あとはパパっとFirebaseにデータを送信することで共有機能を付けたいと思っています。
この際、Firebaseは通信回数に制限があるため、データの取り出し機能の工夫をどうしようか迷っています。

また、アプリを開いた後に設定から位置情報をOffにするとバグるので、その部分の改善が必要です。

そちらの部分が完成したら、続報を書きたいと思っていますのでよろしくお願いします。

コメント