はじめに
本日はついこの間まで趣味で開発していたアプリについて紹介したいと思います。
それは方向音痴メモというアプリです。
(仕事終わりに1時間ちびちびと開発していたこともあって、)製作期間は1ヶ月もかかってしまいました。
全然大した機能があるわけでもないのに…。
今回の開発を通して学んだこともあるため、記録として本記事を書こうと思います。
アプリの紹介
アプリの機能から紹介したいと思います。
まず、アイコンはこちらになります。
![]()
アプリのコンセプト
このアプリのターゲットはアプリの名にもある通り『方向音痴な人』です。
このターゲットを助けるために筆者は下記が必要だと考えました。
- 道に迷った時に、通った場所の記憶を蘇らせるためのメモを残せる
- メモは「その場所の概要」や「その場所の画像」を記録できるようにする
上記を実装したのが、今回のアプリになります。
アプリの使い方
ではアプリの使い方を見ていきましょう。
今回はアプリ起動時にチュートリアルを見れるようにしたため、そのチュートリアルの指示に従って進めば簡単だと思います。
基本的な使い方
チュートリアルを進むことで、下記のように、基本的な使い方を知ることができます。



不要なポイントの削除
誤ってポイントを作成してしまうこともあると思います。
そんなときには下記のように不要なポイントを削除してしまいましょう。

ポイントの全削除
配置したポイントを一気に削除することもできます。

チュートリアルをもう一度見る
初回起動時にチュートリアルを見たものの、使い方を忘れてしまうこともあるでしょう。
そんな時用にチュートリアルをもう一度見る機能を用意しています。

アプリの実装
続いて実装面に関して触れます。
実コードはGitHub: HelpSenseOfDirectionを参照頂ければと思います。
プロジェクト構成
Xcode上のプロジェクト構成は下記の通りです。
今回もMVCで実装しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
利用ライブラリ
今回利用したライブラリは下記になります。
- Realm / RealmSwift
足跡のデータを端末内部に保存するために利用しています。 - Google Maps SDK for iOS
今回はAppleデフォルトではなく、Google Mapsを利用しています。 - Alamofire
Google Directions APIやGeocoding APIを利用する際にネットワーク通信が必要なので利用しています。 - SwiftyJSON
APIレスポンスとしてJSON方式で取得するので扱いやすさのために導入しています。 - Gecco
チュートリアル表示用に利用しています。
各クラスの説明
今回も少々クラス説明を書いておきたいと思います。
Enum/MarkerType.swift
今回のアプリでは スタート地点/ゴール地点/途中ポイント地点 の3種類の地点にマーカを設置する必要があるため、Enumとしてパターンを定義しています。
デフォルトは最も多く設置するであろう 途中ポイント地点 である MarkerType.point としています。
因みに SwiftLint の設定で Enum の case 定義は 小文字始まり としているため、それぞれ start/point/goal としています。
Model/CustomGMSMarker.swift
Google Maps SDK for iOSでは GMSMarker クラスが用意されています。
今回のアプリでは、
- スタート地点/ゴール地点/途中ポイント地点とタイプ別でマーカを設置する
RealmにIDを採番してマーカ情報を保存する- マーカをタップしたときに
InfoWindowに表示する地点情報をIDを元にRealmから取得する
という処理が必要であるため、通常の GMSMarker クラスでは機能が足りません。
よってプロパティにidとtypeを追加した CustomGMSMarker を作成しました。
Model/Direction.swift, Model/Geocoding.swift
こちらはGoogle Maps SDK for iOSだけではカバーできない機能があるため、
Google Directions APIやGoogle Geocoding APIを利用します。
そのためのクラスになります。
Model/Marker.swift
これは少々わかりにくいクラスになってしまいました。
と言うのも、ViewController.swiftのputMarkerのメソッドの引数を減らすためだけに作成したクラスだからです。
各種でMarkerというワードを利用していることもあって非常にわかりにくいですね…
Model/RealmMarker.swift
RealmSwiftを利用しているので、保存するモデルの形式です。
Model/RealmMarkerManager.swift
RealmSwiftを用いてデータの保存/取得/削除などを管理するクラスです。
View/MarkerInfoContentsView.swift
マップにプロットするマーカをタップしたときに表示するInfoWindowに当たります。
View/UIPlaceHolderTextView.swift
こちらはInfoWindow内にUITextViewが必要だったのですが、UILabel同様にplaceholderを表示したかったため利用しています。
UITextViewでのPlaceHolder(プレースホルダ)をSwiftで実装する方法からほぼほぼ拝借させて頂きました。
View/CustomCell.swift
チュートリアルを再度閲覧できるように設定画面にUISwitchつきのCellを用意する必要があったため、作成しました。
ViewController/ViewController+◯◯.swift
さて今回はViewController+CLLocationManager.swiftのように幾つかファイルを分けています。
理由としては、ViewControllerが肥大化することで最大行数がSwiftLintのデフォルト値を超過してしまったためです。
簡単のためにdelegate系を別ファイルとして切り出しました。
まとめ
さて、如何でしたでしょうか?
正直、iOSアプリを開発する際のプロジェクト構成やアーキテクチャには迷いがあります。
今は個人で1ヶ月程度で開発成果を残していくことが目的になっているため、慣れているMVC形式での開発で進めてしまっています。
ただ、チーム開発やモダンな開発のことを考えるともう少しチャレンジを入れてみたいと思っています。
引き続き別アプリの開発を進めているので、徐々に新しい要素を追加してブログ記事に残せていければと思います。
と言ったところで本日はここまで。