ちゃんと理解してますか?Appleの新技術「iBeacon」
ヤフー羽田です。
登場から時間も経ち、サービス化されたり、アプリ化されることも珍しくなくなったiBeacon。
そんな今だからこそiOSに携わる企画者・エンジニアとして「知っておかなければいけないこと」が多々あります。
今回は基礎的な部分からサービス設計を含めたiBeaconに関してエンジニアと企画者が、絶対+最低限知っておくべきことを紹介します。
この記事で学ぶこと
iBeaconに関する以下の事項について解説していきます。
- 基礎知識
- 取り巻く現状、サービス事例
- よくある間違い
- セキュリティ
- 知っておくべき最低限のこと一覧
- 開発/検証方法の紹介
- 今後
1.基礎知識
iOS 7から搭載されたGPSにかわる近距離通信の新しい仕組みです。
CoreLocation.Frameworkに追加され、BLE(Bluetooth low Energy)と呼ばれる低電力で動作可能なBluetoothの新規格を用いていて、送受信ともに非常にシンプルなコードでの実装が可能です。
2.取り巻く現状、サービス事例
飲食店での応用、注文や店員呼び出しなどを機能としてもたせ、注文時のアクションにフックしてクーポンの提供なども行う。
小売り向けにiBeaconの利用支援を行うプラットフォーム。
3)トーハクなび
スタンプラリーや展示説明。その他にもiBeaconのハッカソンが行われたりiPhoneとリアルをつなげる様々な取り組みが行われています。
リアルな行動が必要な、洋服の購入やイベントへの参加などのアクションに付加価値をつけたり、それを訴求させる仕組みとしてプッシュ型のクーポン・情報配信のために用いられていることがとても多いです。
またビーコンの発信器として利用できるEstimoteを代表としたビーコン端末も多様化してきていて、極薄フィルム型・超小型の端末も開発されています。BLEの特徴とする低電力稼働の特性を活かして、小型化が可能になっているようです。
3.よくある間違い
× Bluetoothを使った相互通信だ!
○ 相互通信はできない
あくまでブロードキャストするもので、従来のようなBluetooth通信とは少し異なるものであることを理解してください。受信側で得られるのは送信側のビーコンを識別する情報であるuuid, major, minorなどの限られたデータです。またペアリングも必要なく、セントラルは複数のペリフェラルを検知できます。
コンテンツの配信や相互通信は以下の図のようなアーキテクチャを構築しサーバ経由で行う必要があります。
× iPhone2台ないと試せない
○ iPhone2台なくても検証できる
下記の開発検証方法にも書きますが、MacとiPhoneがあれば送受信の検証ができます。
× BLEが使えればどのデバイスでもできるんだろ? ○ いろいろ複雑です…
例えばAndroidにしても、まず実装の部分でiOSと違います。iOSのようにiBeaconのクラスみたいなものはないので、Advertiseパケットを自前でパースするような実装をする必要がり、OSも4.3以降でないと対応していないのが現状です。
様々なベンダーから提供されているビーコンの端末を見ても送信強度や、利用形態が異なるので注意が必要になります。
4.セキュリティ
ビーコンの識別子であるuuid,major,minorの値は、容易に傍受できてしまうので、偽ビーコンやなりすましが危惧されます。「uuidをワンタイムパスワード的に変える」などのやり方もありますが、あまりセキュアな手法ができていないのが現状です。
また識別子であるuuidは、企業ごとやサービスごとに一意に割り当てられるもの、というのがアップルの想定です。そのため、これを逐次変える手法もおすすめできません。
そのため、導入の際にはサービス設計において、そもそも「なりすましが生じた場合に困る情報の配信」をすべきではありません。例えば「webで使えるクーポンをiBeaconで配信」などは不適切で、「お店で使えるクーポン」の配信や「なりすまし」による実害のないような情報を提供すべきです。
5.開発で知っておくべき最低限のこと一覧
iOSエンジニアとして知っておくべきことは多くありますが、特に知っておいてほしいことは以下のようなものがあります。
- xocde 5が必要
- 情報の双方向通信はできない、ペリフェラルは送るのみ・セントラルは受信のみ。相互をしたい場合はサーバを経由して別の処理を書く必要がある
- iOS 6でもペリフェラルにはなれる
- シミュレータではiBeaconの検証はできない
- 取得できる距離は曖昧
- EstimoteやStickNFindなど様々なBeacon発信器があるが、すべての端末で同じ挙動とは限らない,SDKやリファレンスも多くない
- アプリが起動していなくても使えるのはiOS 7.1から、capabilities > background modeの位置情報サービスをonにする必要がある
- アプリが起動してない場合はレンジングはできない
- Estimoteなどビーコン端末によっては技適マークが付いておらず実運用すると電波法違法になる場合がある
- ビーコン端末は価格対は300~4000円くらいで、だいたいは設定アプリがあって自由に識別情報をつけられますが、ものによっては端末ごとにmajor, minorが固定だったりするので精査が必要
6.開発/検証方法の紹介
送受信機あって成り立つ機能なので、最低でも2台のBLE端末を準備する必要があります。
一番手っ取り早いのはMac + iPhoneで送受信を行う方法、例えばiPhoneをペリフェラル、MBAをセントラルにするなら以下の二通りのやり方があります。
1.MacOSXアプリケーションを作る
2.Bleacon(Node.js)を使う
1.はソースも多く実例も多いし、細かいチューニング(端末のBluetoothの状態管理、取得)などもできますが、手っ取り早いのは2.の方法です。
Bleaconを用いてMacで受信してみる
BleaconはNode.jsで動くモジュールでターミナルからのビーコンの送受信を可能にします。
サイトにも書いてありますがnodeのバージョンによっては動きません。私はver0.11で動作を確認しました。
$ npm install bleacon
$ vim ~/node/central.js
// Bleacon central.js code.
Bleacon = require('bleacon');
Bleacon.startScanning();
Bleacon.on('discover', function(bleacon) { console.dir(bleacon); });
これで検証はできますが、実際にサービス化するときは環境によって、Bluetoothの挙動が異なるため、必ず実際の場所と端末で検証を行うべきです。
iOS側の実装
ペリフェラルにするには以下のようなコードを書きます。
特徴としては各コメントに書きましたが、セントラルと違い既存のBluetooth.Frameworkの実装を色濃く使うことや、CBPeripheralManagerの利用時は、queueやoptionをどのように使うかなどに気を使いましょう。
IBSViewController.h
// 送信側
// 必要なフレームワークは2つ、CoreBluetoothとCoreLocation
//
#import <UIKit/UIKit.h>
#import <CoreBluetooth/CoreBluetooth.h>
#import <CoreLocation/CoreLocation.h>
@interface IBSViewController : UIViewController<CBPeripheralManagerDelegate>
@end
IBSViewController.m
#import "IBSViewController.h"
// Beacon信号に含まれる識別子
// Macならターミナルから $ uuidgen で生成可能
#define UUID @"80D8FFC4-9807-407C-8C4D-F7AF9248B027"
#define MAJOR 1
#define MINOR 2
// Beacon信号に含まれず、領域識別のための内部管理用の識別子
#define IDENTIFER @"jp.sample.beacon"
@interface IBSViewController ()
@property(nonatomic, strong)CBPeripheralManager* peripheralManager;
@property(nonatomic, strong)NSUUID* proximityUUID;
@end
@implementation IBSViewController
@synthesize peripheralManager;
@synthesize proximityUUID;
#pragma mark - lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.proximityUUID = [[NSUUID alloc] initWithUUIDString:UUID];
// queueは実行するキュー、optionには以下の二つが指定できる
// - CBPeripheralManagerOptionShowPowerAlertKey :
// - CBPeripheralManagerOptionRestoreIdentifierKey :
// 詳しくは以下に記載されている。
// https://developer.apple.com/Library/ios/documentation/CoreBluetooth/Reference/CBPeripheralManager_Class/Reference/CBPeripheralManager.html#//apple_ref/doc/constant_group/Peripheral_Manager_Initialization_Options
// NSMutableDictionary *options = [@{CBPeripheralManagerOptionShowPowerAlertKey : @YES} mutableCopy];
// self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:@{CBPeripheralManagerOptionShowPowerAlertKey:@NO}];
// どちらもnilでいいが、あえて指定するなら以下のようにする
// restoreの指定をする場合、BackgroundModeで"Act as a Bluetooth LE Accessary"の指定をする事と、willRestoreStateのdelegateを呼ばないといけない
self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_queue_create("jp.sample.beacon.peripheral", DISPATCH_QUEUE_SERIAL) options:@{CBPeripheralManagerOptionRestoreIdentifierKey: @"jp.sample.beacon.peripheral"}];
// CBPeripheralManagerState の状態は Bluetoothの状態(電源のOn,Offやアプリケーションに実行権限があるかなど)を確認してくれる。
if (self.peripheralManager.state == CBPeripheralManagerStatePoweredOn) {
[self startAdvertising];
}
}
#pragma mark - other method
- (void)startAdvertising
{
// CLBeaconRegionを作成してアドバタイズするデータを取得
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:self.proximityUUID
major:MAJOR
minor:MINOR
identifier:IDENTIFER];
NSDictionary *beaconPeripheralData = [beaconRegion peripheralDataWithMeasuredPower:nil];
// アドバタイズを開始
[self.peripheralManager startAdvertising:beaconPeripheralData];
}
#pragma mark - location delegate
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{
if (self.peripheralManager.state == CBPeripheralManagerStatePoweredOn) {
[self startAdvertising];
}
}
// CBPeripheralManagerOptionRestoreIdentifierKey 設定時に呼び出される
#pragma mark - CBPeripheralManager delegate
-(void)peripheralManager:(CBPeripheralManager *)peripheral willRestoreState:(NSDictionary *)dict{
}
@end
7.今後
Bluetoothの規格を行うBT sig社チーフディレクターのシューク・ジョワンダ氏は2014年には2011年の2倍にあたる年間40億台に達すると述べています。
また、samsungもiBeaconと同様のBLEを用いた無線技術を、Flybellという名前で商標登録したという話もあります。こういった背景からもiBeacon、BLEを用いたサービスや、アプリはさらに増えていくと予想されます。
ユーザーにリアルとリンクした体験を提供できる強みはあっても、まだセキュリティやBLEの復旧率が十分でないのも事実、あなたがiBeaconを扱うことになった場合、上記のような注意点や特性を適切に理解して、サービスの設計や開発をしてください。
CodeIQコード銀行にあなたのコードを預けてみませんか?
- CodeIQコード銀行ではあなたのコードを財産と考えます。
- お預かりいただいたコードは、CodeIQコード銀行がしっかり評価し、フィードバックいたします。
- 当コード銀行にお預けいただいたコードは、企業がみてスカウトをかける可能性があります。
- 転職したい方や将来転職することを考えている方で、今の自分のスキルレベルを知りたい方はぜひ挑戦してみてください。
- 企業からスカウトがきたら困る人は挑戦しないでください。
興味を持った方はこちらからチャレンジを!
ヤフー株式会社 エンジニア
iOSやAndroidなどの様々なプロジェクトに参加。
Twitter:@jumbOS5