ChanLab Report

近況の備忘録ブログ

Swift + GPSログをとる (Part1)

過去記事(序章)はこちら

はじめに

定期試験やら大学院試などで少し作業が疎かに...。
さて久々に研究を進めようと思い、上記の過去エントリーを見たところ
自分で書いている記事なのに、何書いてるのかがよく分からないという事態に。

…ということで、今記事をPart1として過去エントリーのまとめを行うことにしました。

前準備

Homebrewの導入

$ brew install wget

リンク:Homebrew — OS X 用パッケージマネージャー

CocoaPodsの導入

$ sudo gem install cocoapods

リンク:CocoaPods.org

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からインストールを行う。

Realm Browser

Realm Browser

  • Realm
  • 開発ツール
  • 無料

GPSに関する予備知識

GPSとは?

GPSはGlobal Positioning System(全地球測位システム / グローバルポジショニングシステム)の略称。

基本的な測定手法

3つの距離測定衛星と1つの誤差修正衛星の合計4機の人工衛星を利用して位置を測定している。
衛星から発された電波が地表位置に届くまでにかかった時間を利用して距離を割り出し、時刻誤差修正用の4つ目の衛星を使い位置を修正している。
f:id:changmin1015:20160714172545p:plain
参考:・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

iPhone

・iPhone 6S Plus → iOS10
・iPhone 6S → iOS9.3.3
iPhone 5S → iOS9.3.2

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ログをとる (序章)

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 

kazuhei.hatenablog.com

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の互換性があるので、サンプルそのものは実行可能。アプリも正常に動く。)
f:id:changmin1015:20160624115534p:plain
⇨ ちなみにSwift2.3とSwift3.0ではコードがこんなにも異なる。
f:id:changmin1015:20160624120611p:plainf:id:changmin1015:20160624120612p:plain

解決策

⇨ Swift3.0の情報があまりにも少ないので、とりあえずβ版でプロジェクトを新規作成するのは辞める。
⇨ サンプルプロジェクト自体は動くので、サンプルファイルを改造して作業を行う。

Swift + GPS地図アプリ

Swiftとは?

Swift(スウィフト)は、アップルのiOSおよびOS Xのためのプログラミング言語Worldwide Developers Conference (WWDC) 2014で発表された。
Swift (プログラミング言語) - Wikipedia