わふうの人が書いてます。

iOSアプリケーション開発、BLEのファームウェアとハードウェア試作のフリーランスエンジニア。

iOS8のvisit monitorin (訪問先追跡)

iOS8のvisit monitoring

iOSは、位置情報取得が初めて登場した時から、電池消費量に注意して設計されています。位置情報を調べる物理手段は、携帯電話基地局、WiFiルータの識別子、GPS などがありますが、アプリケーションが位置情報を取得するときに、どの物理手段を使うかを直接していすることはありません。必要とする位置精度にあわせて、iOSが最適な物理手段を選択して、アプリケーションに位置情報を通知してくれる作りになっています。

毎年新しい位置情報の技術と機能が導入されているiOSですが、iOS8では、visit monitoring という訪問先の自動記録機能が導入されました。これは24時間365日、ユーザが訪問した場所とその滞在時間を記録し続ける機能です。

Githubのサンプルアプリ。visit monitoringで取得したデータをテキストで表示し続けるだけのサンプルアプリです。

https://github.com/reinforce-lab/ObjC_Codes/tree/master/visitMonitoringTest

visit monitoringの使い方はとても簡単です。

iOS8は、位置情報取得の権限が、when in use, アプリが実行されている間のみ(画面表示されている間のみ)と、always, バックグラウンドなど常に取得、の2つにわかれました。

まず、訪問先を記録し続けるなら、アプリケーションが画面に表示されていない時(バックグラウンド)でも情報が取得できなければ意味がないので、常に情報取得する権限を要求します。

CLLocationManagerのオブジェクトにデリゲートを設定して、 requestAlwaysAuthorization メソッドを呼び出し常に位置情報を取得する権限を要求します。初回呼び出し時には、iOSがユーザに権限要求のダイアログを表示してくれます。

Xcodeで、プロジェクトの Capabilities の Background Modes で Location updates にチェックを入れておくのも、忘れないようにします。

1
2
3
4
5
6
7
CLLocationManager *_locationManager;
...
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;

// requesting a permission. NSLocationAlwaysUsageDescription key must be in your app’s Info.plist file.
[_locationManager requestAlwaysAuthorization];

アプリケーションが実行されると、必ず CLLocationManager のステータス変更が通知されます。権限があれば、位置情報取得を開始したいので、この didChangeAuthorizationStatus: のなかで startMonitoringVisits

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
switch (status) {
case kCLAuthorizationStatusAuthorizedAlways:
[_locationManager startMonitoringVisits];
break;
// 権限がない場合は、なにもしない
case kCLAuthorizationStatusAuthorizedWhenInUse:
default:
break;
}
}

- (void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit *)visit {
//ログを残す
[self write:[NSString stringWithFormat:@"%@", visit]];
}

visit monitoringは、イベントが発生するたびに iOSは CLVisitのオブジェクトを渡して デリゲートの didVisit: を呼び出します。訪問場所に入った時点、訪問場所を去った時点それぞれ通知が来ます。

どの条件で訪問したと判定するかはわかりませんが、飲食店や書店あるいはオフィスなど、訪問したことに意味がありそうな場所が通知されている感じはしました。電力消費量は、気になるレベルではない感じです。

位置情報の取得にどんな手段を使っているかは、わかりません。CLVisitの位置精度を見ていると、+-60メートル程度のログをよく見るので、おそらく基地局レベルとWiFiを組み合わせて受動的に取れる範囲の位置情報を使っているのではと思います。もしもGPSを利用しているなら+-20メートル以下になるでしょうから。

いまのiOSデバイスは、少ない電力で動きを常時検出できるように、小さいマイコン(M7/M8プロセッサ)が入っています。それらの動き情報も統合して利用しているのだろうとは思います。

電池消費量を気にするにしても、訪問したと判定した瞬間、その瞬間にGPSをONにしてもよさそうなものだと思いますが、訪問先が屋内であったりすること、必要なものは位置精度というより、お店に立ち寄ったといったイベント情報であれば、GPSという精密な位置情報それ自体に意味を見出さない考え方なのかもしれません。

iOSは、WiFiの識別子を取得する関数がプライベートAPIになっていて、ストア承認されたアプリでの利用が禁止されています。ですがiOS自体は、お店のWiFiだとわかるようなデータベースを持っていたりするのかもしれません(あてずっぽう)。屋内地図のデータ提出受付をしたときには、WiFiやiBeaconを含めて、より詳細な位置情報をAppleつまりiOSが持つことになるのは、確実だと思います。

ただ立ち止まったりしただけでも記録されるかなど、実験してみてもいいのかもしれませんが、めんどいのでパス。

何に使うのか

まず思い浮かべるのは、カレログ、ですが、iBeaconの時にそうであったように、単一のアプリの視点からみても、利用場面は出せないものなのだろうと思います。

Bluetooth Low Energy の時もそうでしたが、Appleは、自社が組み上げるサービスに必要な新しい技術要素を、サービス発表の2年前から出してくる感じがします。おそらく、iBeacon、visit monitoringなどは、iOS8以降の世界を組み上げるのに必要な1技術要素なのだろうと思って、とらえたほうが良さそうです。