BeaconBridgeを利用したiOSアプリを作ってみた


ビーコンも届いたので、前に利用登録したBeaconBridgeのSDKを利用して、iOSアプリを作ってみました。
備忘録を兼ねて、少し実装についてまとめてみました。

なお、この記事をベースに実装したものはGitHubで公開しています。
https://github.com/mugicha755/BeaconBridge-Sample

BeaconBridgeのユーザ登録と概要はこちら
<a href=http://qiita.com/mugicha/items/7499c104da78d5d36bce>BeaconBridgeにユーザ登録してリファレンスアプリを使ってみた(iOS)</a>


# アプリケーション概要
**概要**
自席にビーコンを置いて、在席と離席をロギングする。
> ひとまずビーコンアプリとしては動作確認しやすい簡単なもので。
> ちゃんと作れば出退勤の管理ができるはず。


# 実装

## 管理画面

### 1. サービス追加
サービスを登録。
ひとまず、「サンプル」として新規登録。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/ad542133-6afb-047b-fc37-fa70eb2fee7c.png" alt="add_service" width="800">

### 2. ビーコン登録
利用するビーコン情報を登録。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/4ed815ce-7ec9-8121-0102-b547ef95080f.png" alt="add_uuid" width="800">

> UUIDは下記Webサイトで生成。
> http://www.itu.int/en/ITU-T/asn1/Pages/UUID/uuids.aspx
> 手順からは省略しましたが、ビーコン情報の設定はGimbalビーコンにもしました。


### 3. アクション登録
ビーコンを検知した時に実行するアクションの情報を登録。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/9838b680-f8d5-4169-0f10-2a9c7822a95e.png" alt="add_action" width="800">

> key に [data_type3] と設定しておくと、SDKがiOS用の定義として認識するらしい。


### 4. ルール登録
登録したビーコンの「Enter」と「Exit」を検知した時の動作を登録。
「Enter」で自席にいる、「Exit」で自席から離れたと判断するイメージです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/b8b440d9-77ba-13f3-3618-4078421a9eeb.png" alt="add_rule">

> 登録したビーコンとアクションをそれぞれ「Enter」イベントと紐づける。
> スクリーンショットは用意してませんが、「Exit」も同様に。


### 5. APIキー発行
「+」ボタンをクリックし、ラベルを設定すると該当サービスのAPIキーが発行される。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/66e1833e-1999-649b-840d-3ce463202532.png" alt="add_rule" width="800">

> このAPIキーをSDKに渡すことで、SDKとユーザページで作成したビーコン検出のルールが紐付けられる。



## アプリケーション実装
### 1. imhereSDK.frameworkインポート
imhereSDK.frameworkをプロジェクトにドラッグ&ドロップ
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/3cfa7b26-08bb-8a15-8027-e46f72a1664a.png" alt="sdk_import" width="400">

> imhereSDK.frameworkはユーザページからDLしました。
> BeaconBridgeなのに、imhereなのが凄く違和感がありますが、どうやら開発コードらしいです。

### 2. iOS SDKのframeworkインポート
下記3つをインポート
・CoreLocation.framework
・CoreBluetooth.framework
・SystemConfigration.framework

![sdk_import](https://qiita-image-store.s3.amazonaws.com/0/67540/8baac820-ba79-a34c-76bc-f1fa93578ac9.png)




### 3. plist更新
iOS8よりCoreLocation(iBeacon)で近接監視するために必要になった認証情報をinfo.plistに追記。
> **Key**
> NSLocationAlwaysUsageDescription

> **Type**
> String

> **Value**
> 任意の文字列

![plist](https://qiita-image-store.s3.amazonaws.com/0/67540/74557bb7-5128-8db9-929c-d485139debc1.png)




ソースコード表示にして直接編集しても可。

```xml:info.plist
<key>NSLocationAlwaysUsageDescription</key>
<string>任意の文字列</string>
```

### 4. 実装
最低限次の3点を実装することで動作する。
・4-1. SDK初期化 & 検出ルール更新
・4-2. ビーコン検出開始
・4-3. delegateの実装


#### 4-1. SDK初期化 & 検出ルール更新

```objectivec:sdkMng.m
#import<imhereSDK/imhereSDK.h>
#import<imhereSDK/imhereDefine.h>
#import<imhereSDK/sdkResult.h>


#define URL		{BeaconBridge trial URL}
#define API_KEY	{Your API_KEY}


@interface sdkMng()<imhereSDKDelegate>
{
	imhereSDK *_sdk;
}

~ 省略 ~

-(void)setSDK{
	// 初期化 push通知は利用しないのでnilを設定
	_sdk = [[imhereSDK alloc] init];
	_sdk.delegate = self;
	[_sdk initialize:[NSURL URLWithString:URL]
                                   apiKey:API_KEY
                                pushToken:nil];
	// ルール同期                        
	[_sdk syncRules];
}



```


#### 4-2. ビーコン検出開始

```objectivec:sdkMng.m

-(void)startMonitor{
	[_sdk startMonitor];
}

```

#### 4-3. delegateの実装

```objectivec:sdkMng.m
#pragma -mark sdk delegate method
// ビーコン検出時のアクションの実行可否
-(id)notifyPreBeaconAction:(NSDictionary *)pAction{
	// 実行を通知
    return KEY_ACTION_EXECUTION;
}

//ビーコン検出時のアクション情報
-(void)notifyBeaconAction:(sdkResult *)pPostResult
           withActionList:(NSArray *)pActList{
	//アクション検出でロギング
}

//サーバ側に通知する付加情報の設定
-(NSDictionary *)confirmExtraData:(NSDictionary *)pEvents
{
	// 特に追加する情報なしのため、そのまま通知
    return pEvents;
}



```


## 作ったアプリケーションの画面

<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/797a0187-a739-d719-8651-8e0d3ed4e6d6.png" alt="sdk_import" width="350">

> とりあえず、動作確認ができる程度のアプリです。
> 勤怠管理までするなら画面やデータの永続化含めていろいろと検討が必要...


# まとめ
・SDKで提供されているため、自分で一から実装するよりかなり楽(特にサーバとの連携あたり)
・今回作ったものはクライアントアプリで閉じた実装なので、もう少し色々なことも試してみようと思う