CodeIQ MAGAZINECodeIQ MAGAZINE

企画とエンジニアが知っておかないといけない「iBeacon」の話 #iBeacon #yahoo #iOS7

2014.05.20 Category:技術コラム Tag: , ,

  • 188
  • このエントリーをはてなブックマークに追加
iBeacon

iOS 7から搭載された新機能「iBeacon」。このiBeaconを使ってアプリを作るエンジニアも少なくないのではないでしょうか。

そこで今回はヤフーでiOSアプリを開発している羽田さんに、iBeaconに関する基礎的な部分からサービス設計、サービス事例などについて、解説していただきました。
by 馬場美由紀 (CodeIQ中の人)

ちゃんと理解してますか?Appleの新技術「iBeacon」

ヤフー羽田です。

登場から時間も経ち、サービス化されたり、アプリ化されることも珍しくなくなったiBeacon。

そんな今だからこそiOSに携わる企画者・エンジニアとして「知っておかなければいけないこと」が多々あります。

今回は基礎的な部分からサービス設計を含めたiBeaconに関してエンジニアと企画者が、絶対+最低限知っておくべきことを紹介します。

この記事で学ぶこと

iBeaconに関する以下の事項について解説していきます。

  1. 基礎知識
  2. 取り巻く現状、サービス事例
  3. よくある間違い
  4. セキュリティ
  5. 知っておくべき最低限のこと一覧
  6. 開発/検証方法の紹介
  7. 今後

1.基礎知識

iOS 7から搭載された近距離通信の新しい仕組みです。
iPhoneなどBLE(Bluetooth low Energy)を使える端末を発信器として、その端末の持つエリアへの入出検知や距離計測を実現できます。CoreLocation.Frameworkに追加され、BLEと呼ばれる低電力で動作可能なBluetoothの新規格を用いていて、送受信ともに非常にシンプルなコードが可能です。(*1)

iBeacon – 日本語ドキュメント

2.取り巻く現状、サービス事例

1)中国火鍋専門店小肥羊

飲食店での応用、注文や店員呼び出しなどを機能としてもたせ、注文時のアクションにフックしてクーポンの提供なども行う。

2)swirl【海外】

小売り向けに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エンジニアとして知っておくべきことは多くありますが、特に知っておいてほしいことは以下のようなものがあります。(*2)

  • Xcode 5が必要
  • 情報の双方向通信はできない、ペリフェラルは送るのみ・セントラルは受信のみ。相互をしたい場合はサーバを経由して別の処理を書く必要がある
  • シミュレータではiBeaconの検証はできない
  • 取得できる距離は曖昧
  • EstimoteやStickNFindなど様々なBeacon発信器があるが、すべての端末で同じ挙動とは限らない,SDKやリファレンスも多くない
  • アプリが起動していなくても使えるのはiOS 7.1から、capabilities > background modeの位置情報サービスをonにする必要がある
  • アプリが起動してない場合はレンジングはできない
  • Estimoteなどビーコン端末によっては技適マークが付いておらず実運用すると電波法違法になる場合がある
  • ビーコン端末は価格帯は300~4000円くらいで、だいたいは設定アプリがあって自由に識別情報をつけられますが、ものによっては端末ごとにmajor, minorが固定だったりするので精査が必要

6.開発/検証方法の紹介

「とりあえず使ってみたい」という場合であれば、Estimote Virtual Beaconというアプリがあり、iPhone2台あればシミュレートができます。

しかし、iBeaconの使える端末を2台持っている人はけして多くないと思います。そこで今回はiOSに関するプロジェクトならば、必ずその場にあるであろうMacOS+iPhoneで送受信を実装する方法を紹介します。オススメのやり方としては以下の2つ。(*3)

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); });

Github – iBeacon

これで検証はできますが、実際にサービス化するときは環境によって、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の規格を行うBluetooth SIG社チーフディレクターのシューク・ジョワンダ氏は、BLE搭載端末が2014年には2011年の2倍にあたる年間40億台に達するだろうと述べています。

また、samsungもiBeaconと同様のBLEを用いた無線技術を、Flybellという名前で商標登録したという話もあります。こういった背景からもiBeacon、BLEを用いたサービスや、アプリはさらに増えていくと予想されます。

ユーザーにリアルとリンクした体験を提供できる強みはあっても、まだセキュリティやBLEの復旧率が十分でないのも事実、あなたがiBeaconを扱うことになった場合、上記のような注意点や特性を適切に理解して、サービスの設計や開発をしてください。

※1、※2、※3については、公開後(2014/5/23 18:40)に改定を行いました。

羽田健太郎氏

寄稿者プロフィール 羽田健太郎氏
ヤフー株式会社 エンジニア
iOSやAndroidなどの様々なプロジェクトに参加。
Twitter:@jumbOS5

CodeIQコード銀行にあなたのコードを預けてみませんか?

  • CodeIQコード銀行ではあなたのコードを財産と考えます。
  • お預かりいただいたコードは、CodeIQコード銀行がしっかり評価し、フィードバックいたします。
  • 当コード銀行にお預けいただいたコードは、企業がみてスカウトをかける可能性があります。
  • 転職したい方や将来転職することを考えている方で、今の自分のスキルレベルを知りたい方はぜひ挑戦してみてください。
  • 企業からスカウトがきたら困る人は挑戦しないでください。

興味を持った方はこちらからチャレンジを!

  • 188
  • このエントリーをはてなブックマークに追加

■関連記事

Siriに聞いてみた!音声認識を成立させる「音響モデル」と「言語モデル」について... Siriは何でも知っている 自分自身のことでさえも… Siriの面白さの一つは問答の作り込みで、その種のコンテンツが後を絶ちませんが、検索機能にアクセスできることによって、「Google先生」に続く物知りキャラが誕生した感もありますね。 彼女は何でも知っています。 そう、自己を確立させている音...
フィボナッチ数列で学ぶ「Swift」の関数型プログラミング... フィボナッチ数列を題材に、Swiftと関数型プログラミングを学ぼう どうも、@taketo1024こと佐野です。 僕はヤフーで iOS アプリ開発をしており、今年から「プログラマのための数学勉強会」を隔月で開催しております。 7月24日には 第4回の開催を予定しており、これまでCodeIQさん...
佐々木俊尚氏を顧問に、オウンドメディアも開設!家事シェアサービス「Any+Times」は、個人のスキ... 誰かのニーズと誰かのスキルを、Webとリアルで交換 仕事で毎日遅くなるので、掃除や洗濯をする時間が取れない。そんな悩みを持つエンジニアも少なくないのではないだろうか。ハウスクリーニングサービスはいくつもあるが、安心して頼めて、かつ低コストのサービスはそうそうあるものではない。 「私自身が、便利屋...
Monacaでenchant.jsで作ったHTML5ゲームを、シュン君とスマートフォンに移植してみよ... なぜ、スマートフォンアプリ化する必要があるの? 前回までの講師は、UEI清水亮氏(前編・後編)、日本マイクロソフト物江修氏(Windowsストアアプリ編)、Mozilla Japanの清水智公氏(Firefox OS編)。 そして次なるターゲットは、スマートフォンアプリ移植。講師には、アシアル株...
作りたいアプリ・機能を一発逆引き!iOS SDK機能、フレームワーク概要まとめ #iOS8 #DeN... iOS SDK機能、フレームワーク概要のまとめと機能別逆引き CocoaPodsの登場によって、昨今のiOS開発ではとても簡単にライブラリを導入することができ、皆さんも多くの機能開発が楽になっていると思います。 ただiOS SDK自身にも非常に多くの機能やフレームワークが提供されており、外部ライ...
iOS 8で解禁されたカスタムキーボードを作ってみよう #iOS8 #DeNA... WWDC 2014のあとの進捗どうですか? WWDC 2014が終わって1カ月ほど経ちましたが、皆様いかがお過ごしでしょうか。何よりも開発者の皆様にとって衝撃的だったのはやはりSwiftの登場でしょうか。 モダンな言語に慣れ親しんだエンジニアの中には、Objective-Cの文法キモい・メソッド...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ