Takahiro Octopress Blog

-1から始める情弱プログラミング

方向音痴メモ ver1.0の紹介

はじめに

本日はついこの間まで趣味で開発していたアプリについて紹介したいと思います。
それは方向音痴メモというアプリです。
(仕事終わりに1時間ちびちびと開発していたこともあって、)製作期間は1ヶ月もかかってしまいました。
全然大した機能があるわけでもないのに…。

今回の開発を通して学んだこともあるため、記録として本記事を書こうと思います。

アプリの紹介

アプリの機能から紹介したいと思います。
まず、アイコンはこちらになります。

方向音痴メモのアイコン

アプリのコンセプト

このアプリのターゲットはアプリの名にもある通り『方向音痴な人』です。
このターゲットを助けるために筆者は下記が必要だと考えました。

  • 道に迷った時に、通った場所の記憶を蘇らせるためのメモを残せる
  • メモは「その場所の概要」や「その場所の画像」を記録できるようにする

上記を実装したのが、今回のアプリになります。

アプリの使い方

ではアプリの使い方を見ていきましょう。
今回はアプリ起動時にチュートリアルを見れるようにしたため、そのチュートリアルの指示に従って進めば簡単だと思います。

基本的な使い方

チュートリアルを進むことで、下記のように、基本的な使い方を知ることができます。

チュートリアル1
チュートリアル2
チュートリアル3

不要なポイントの削除

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

不要なポイントの削除

ポイントの全削除

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

ポイントの全削除

チュートリアルをもう一度見る

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

チュートリアルをもう一度見る

アプリの実装

続いて実装面に関して触れます。
実コードは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
HelpSenseOfDirection
├── Enum
    └── MarkerType.swift
├── Model
    ├── CustomGMSMarker.swift
    ├── Direction.swift
    ├── Geocoding.swift
    ├── RealmMarker.swift
    ├── RealmMarkerManager.swift
    └── Marker.swift
├── View
    ├── MarkerInfoContentsView.xib
    ├── MarkerInfoContentsView.swift
    ├── UIPlaceHolderTextView
    └── CustomCell.swift
├── ViewController
    ├── AnnotationViewController.swift
    ├── CreateMarkerViewController.swift
    ├── ViewController.swift
    ├── ViewController+CLLocationManager.swift
    ├── ViewController+GMSMapView.swift
    ├── ViewController+SpotlightControllerView.swift
    ├── SettingViewController.swift
    └── SlideMenuViewController.swift
├── AppDelegate.swift
└── Main.storyboard

利用ライブラリ

今回利用したライブラリは下記になります。

  • 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 の設定で Enumcase 定義は 小文字始まり としているため、それぞれ start/point/goal としています。

Model/CustomGMSMarker.swift

Google Maps SDK for iOSでは GMSMarker クラスが用意されています。
今回のアプリでは、

  • スタート地点/ゴール地点/途中ポイント地点とタイプ別でマーカを設置する
  • RealmIDを採番してマーカ情報を保存する
  • マーカをタップしたときにInfoWindowに表示する地点情報をIDを元にRealmから取得する

という処理が必要であるため、通常の GMSMarker クラスでは機能が足りません。
よってプロパティにidtypeを追加した CustomGMSMarker を作成しました。

Model/Direction.swift, Model/Geocoding.swift

こちらはGoogle Maps SDK for iOSだけではカバーできない機能があるため、
Google Directions APIGoogle Geocoding APIを利用します。
そのためのクラスになります。

Model/Marker.swift

これは少々わかりにくいクラスになってしまいました。
と言うのも、ViewController.swiftputMarkerのメソッドの引数を減らすためだけに作成したクラスだからです。
各種で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形式での開発で進めてしまっています。
ただ、チーム開発やモダンな開発のことを考えるともう少しチャレンジを入れてみたいと思っています。

引き続き別アプリの開発を進めているので、徐々に新しい要素を追加してブログ記事に残せていければと思います。
と言ったところで本日はここまで。

Comments