Swift + GPSログをとる (Part1)
はじめに
定期試験やら大学院試などで少し作業が疎かに...。
さて久々に研究を進めようと思い、上記の過去エントリーを見たところ
自分で書いている記事なのに、何書いてるのかがよく分からないという事態に。
…ということで、今記事をPart1として過去エントリーのまとめを行うことにしました。
前準備
Rubyのバージョンアップ
$ rbenv install 2.2.2
RealmSwiftを導入する
リンク:Realm
上記リンクの記載通りにRealmSwiftを導入する。
今回はCocoaPodsを利用する為、podfileをプロジェクトフォルダに生成しインストールを行う。
Podfileの作成
ターミナルでlsとcdを駆使し、プロジェクトのルートフォルダに移動し、
pod init
と入力する。ルートフォルダにpodfileと呼ばれるテキストファイルが生成される。
Podfileの編集
Podfileを開き、アプリケーションとテストのターゲットに対しpod 'RealmSwift'を追加する。
# Uncomment this line to define a global platform for your project # platform :ios, '9.0' target '**********' do # Comment this line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! pod 'RealmSwift' # Pods for GPS計測アプリ target '**********Tests' do inherit! :search_paths # Pods for testing pod 'RealmSwift' end target '**********UITests' do inherit! :search_paths # Pods for testing pod 'RealmSwift' end end
PodfileからRealmSwiftをインストール
ターミナルでPodfileのあるディレクトリに移動後、
pod install
と入力。成功すると、podがプロジェクトに組み込まれる。
※注意※
この操作をした後、プロジェクトを開く場合は
”*******.xcworkspace”の拡張子のファイルから開く。
これを無視して.xcodeprojの拡張子ファイルから開くと、
"import RealmSwift"をした時にNo such moduleエラーで弾かれる。
RealmBrowserのインストール
App Storeからインストールを行う。
コンパスアプリ
過去エントリー参考
Swift + GPSでコンパスアプリ - SakuLab Report
進捗報告エントリー(状況説明/整理用) - SakuLab Report
Part2へ続く....
GPSに関する予備知識
基本的な測定手法
3つの距離測定衛星と1つの誤差修正衛星の合計4機の人工衛星を利用して位置を測定している。
衛星から発された電波が地表位置に届くまでにかかった時間を利用して距離を割り出し、時刻誤差修正用の4つ目の衛星を使い位置を修正している。
参考:・http://www.hummingheads.co.jp/reports/feature/1308/130826_02.html
・科学 はじめの一歩 (8)GPSでどうして位置がわかるんだろう ? - YouTube
・https://www.youtube.com/watch?v=70cDSUI4XKE
GPS測位では、距離測定の為の「時刻信号」と衛星位置取得の為の「全衛星軌道データ(アルマナックデータ)」「衛星軌道データ(エフェメリスデータ)」を捕捉して利用する。
軌道データは30秒周期、50bpsの伝送レートで送信されるため、GPSのみでの測位には30秒以上を要する。
A-GPS
A-GPS(Assisted-GPS)と呼ばれる従来のGPS技術を補足した技術が存在する。
スマホに用いられる手法
先述したように、GPS測位には「時刻信号」「全衛星軌道データ(アルマナックデータ)」「衛星軌道データ(エフェメリスデータ)」の3つのデータを要する。
このうち、軌道データの2つを基地局から取得することにより、測位時間を短縮するといった技術が用いられている。
基地局が存在しない地域では利用できない上、データ取得に通信を要するため通信料が発生するといったデメリットも存在する。
A-GPS端末では、携帯電話の電波の届いているエリアであれば、 地球上のどこでも市街地で5~10m程度、建物内で20m程度以内の誤差で、現在地を確認できます。 携帯電話では、多くの機種でA-GPSを利用した位置測位が利用できるようになっていて、 いろいろなサービスで位置情報を活用できます。
KDDIはA-GPS技術の一種である、 クアルコムが開発した位置情報取得技術"gpsOne"を多くの機種に搭載済。
参考:・第456回:A-GPS とは - ケータイ Watch Watch
・http://www.appbank.net/2012/12/02/iphone-news/507214.php
Wi-Fiを用いた測定手法
Google Location Server、PlaceEngineの様なクラウドソースデータベースが存在。
アクセスポイントの位置情報を収集し、データベース化したものが存在。
Wi-Fiだけでも現在地を測定できる仕組みとは? | AppBank – iPhone, スマホのたのしみを見つけよう
Xcode + アプリアイコン
アプリアイコン
下記リンクから生成。
resizeappicon.com - Web-based icon resizer for iOS and Android
タブバーアイコン
下記サイトのFree素材を利用。
30,100 Free Icons - The Largest Icon Pack Ever | Icons8
進捗報告エントリー(状況説明/整理用)
実行環境
Mac
・Macbook Pro 13 → OS X El Capitan (ver.10.11.6 Beta)
・Macbook Pro 15 → MacOS Sierra
・Macbook Air 11 → OS X El Capitan
Xcode
- Xcode7.3.1(最新版)とXcode8.0(beta版)を導入。
進捗状況
サンプルプログラム"Compass"を動かす
chancp3.hatenablog.com
①iPhone 6S Plusでも実行出来る様に、CompassのサンプルアプリをXcode8.0で実行。
②Swift2.3/Swift3.0への変換を促すポップアップが出現。
→ Swift3.0を選択するとサンプル自体動作不能。エラー出現。
→ Swift2.3を選択すると動作自体は可能。画面レイアウトに多少のバグ有り。
GPSログをとる
chancp3.hatenablog.com
①Realmを導入するためにCocoaPodsを導入しようとするも、MacOSだとRubyのバージョンの問題で導入不可(困難)。
②Realmを導入するためにCarthageを導入する。
Carthage自体の導入は成功するも、RealmをXcode8.0でインポートしようとするとエラーで弾かれる。そのためRealmの導入自体を断念。
③CoreDataを導入する。Xcode8.0でCoreDataのファイルを作成。
Entryを作成し、サブクラスを作成しようとするとEntryが消えるという謎のバグに遭遇。
Xcode8.0の不具合加減に嫌気がさし、使用中止。Xcode7.3.1に切り替え。
振り出しに戻る
①Xcode7.3.1でサンプルプログラム"Compass"のコードをほぼコピペ。
画面パーツは自分で配置し、コピペコードと連動する様にする。
(磁北/真北セグメントが上手く動作していないが気にしない。)
忘れがちなのは、Info.plistにおいて位置情報の取得許可を促すポップを出現させる設定をすること。
これをしないと現在地がいつまでも取得できないまま。
②CoreDataを導入する。 → Realm導入成功したので、そちらで。
Swift + GPSログをとる (序章)
参考サイト
・CoreDataとRealmの比較およびセットアップと使い方 岸川 克己 先生 - 無料動画学習|schoo(スクー)WEB-campus
・RealmSwiftで簡単なGPSロガー作ってみたのでメモ - koogawa log
Realmの導入(→ 後に断念)
Realmと呼ばれる、大量データを保存するOSS(Open Source Software)を利用してログを取ることを試みる。
Realm
CocoaPodsの利用(→ 後に断念)
Realmを導入する一般的な方法は、CocoaPodsと呼ばれるiOS/Mac向けアプリのライブラリを管理をしてくれるものを導入して行うらしい。
CocoaPods.org
$ sudo gem install cocoapods
キーワード:『Homebrew』
Rudyのインストール
CocoaPodsには上位バージョンのRubyが必要である。
インストールしようとしたら、
ERROR: Error installing cocoapods: activesupport requires Ruby version >= 2.2.2.
と怒られたので、rbenvを使ってをアップグレードを試みる。
以下コマンド
$ rbenv install 2.2.2
標準使用のRubyバージョンを切り替える。
$ rbenv global 2.2.2
トラブル
先日Apple Developerに登録を行った。
この際に、折角だからとMacbookPro15のOSをOS X El CapitanからmacOS Sierraにアップグレードしたのだが、
macOS Sierraは標準でrubyのバージョンが2.0.0になっているらしい。
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
参考資料:macOS Sierra (開発者プレビュー版)と戯れてみる - 古都のIT職人Blog
beta版OSの為Homebrewの調子が悪いのか、Rubyのアップグレードが上手くいかないのでCocoaPodsでの導入は断念。
Carthage(カルタゴ)の利用
Carthageの導入
・Carthageを使ってビルド時間を短縮しよう - Qiita
・Carthageを使ったAlamofireの導入 - 技術は熱いうちに打て -
→ 最初のschooの参考動画を見る限り、もしかしてCocoaPadsもCarthageもいらなかった説。
→ 結局、後述するSugarRecordの導入の際に利用。
Realm導入トラブル
import RealmSwift
をVIewControllerのところで打つと、
Module file was created by an older version of the compiler....
という警告が出てきた。
下記リンクを参照にして解決する。 → 解決しなかったのでRealm自体を諦めることに決定。→ 結局Realm導入成功。
Cmd ⌘ + Alt ⌥ + Shift ⇧ + K
Swift + GPSでコンパスアプリ
GPSを利用した位置情報表示とコンパス
参考文献
アプリ開発
下記の本を参考に、GPSを利用したコンパスアプリ開発を実行。
詳細!Swift 2 iPhoneアプリ開発 入門ノート
コンパスアプリはPART3の第18章6節を参考にして作る。
トラブル
理由
サンプルコードは恐らくSwift2.3で書かれている。
そのため、Swift3.0であるXcode ver8.0-beta(以下β版)を使ってプロジェクトを新規作成すると、サンプルのコードをコピペしたものでも動かない!
エラー詳細
エラー自体は下記の様なものが出現。
Swiftのセレクターのコンフリクトについて - Qiita
Privateに設定するとビルト自体は可能だが、位置情報の取得を行わないし、コンパスも回らない。
(Xcode自体はSwift2.3とSwift3.0の互換性があるので、サンプルそのものは実行可能。アプリも正常に動く。)
⇨ ちなみにSwift2.3とSwift3.0ではコードがこんなにも異なる。
解決策
⇨ Swift3.0の情報があまりにも少ないので、とりあえずβ版でプロジェクトを新規作成するのは辞める。
⇨ サンプルプロジェクト自体は動くので、サンプルファイルを改造して作業を行う。
Swift + GPS地図アプリ
Swiftとは?
Swift(スウィフト)は、アップルのiOSおよびOS Xのためのプログラミング言語。Worldwide Developers Conference (WWDC) 2014で発表された。
Swift (プログラミング言語) - Wikipedia
参考文献
地図表示
Mapkit.framework
★
blog.koogawa.com
iOSで地図・領域観測アプリを作るときに参考にしたサイトまとめ | bick.xyz
→[iPhone] MapView で地図を表示する (Swift)