iBeaconで遊んだ
今話題の〜iBeacon〜。
使ったビーコンはMyBeacon Pro 汎用型 MB004 Ac
オフィシャルサイトからメンバー登録すると管理画面がもらえるので
「MyBeacon Tool」というiPhoneアプリをDLして、そいつでメンバーログインしてからビーコンを登録すると、
管理画面でこんな感じで見られる。
これで準備完了〜。
XCODE触るの久しぶりすぎてドキドキしながらDev CenterでApp ID登録した。
なんとか無事iOSアプリを実機で動かすところまでできたレベル。
iPhoneのBluetoothとアプリへの位置情報提供をONにしておく。
Single Viewでプロジェクトを新規作成してGeneralでCoreLocationFrameworkをライブラリに登録。
バックグラウンドから起動も試したいのでCapabilitiesでBackground ModesをONにしておいた。
Objective-C全然慣れてなくて、変数が先なのかBoardに要素の配置が先なのかわかんない。
でもとりあえず先に変数を宣言した。
ViewController.h
#import <UIKit/UIKit.h>
@import CoreLocation;
@interface ViewController : UIViewController <CLLocationManagerDelegate>
@property (nonatomic) CLLocationManager *locationManager;
@property (nonatomic) NSUUID *proximityUUID;
@property (nonatomic) CLBeaconRegion *beaconRegion;
@property (strong, nonatomic) CLLocationManager *manager;
@property(strong, nonatomic) NSDictionary *proximityDict;
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
StoryBoardにUILabelを追加して、Referencing Outletsをlabelとつなげた。
ViewDidLoadはこんな感じ。
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
// 領域が観測できたら処理
if ([CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) {
// CLLocationManager生成
self.locationManager = [CLLocationManager new];
// 移譲
self.locationManager.delegate = self;
// 観察対象となるMyBeaconのUID入れる。
self.proximityUUID = [[NSUUID alloc] initWithUUIDString:@"MyBeaconのUUIDいれる"];
// CLBeaconRegionのインスタンスを生成する
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:self.proximityUUID
identifier:@"identifier入れる"];
// 観測開始
[self.locationManager startMonitoringForRegion:self.beaconRegion];
// 観測開始時にすでに領域内だとうまく動かなかったりするので、領域内にいるときにレージング開始する処理呼ぶ
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
}
startMonitoringForReagionが呼び出された後はdidStartMonitoringForRegionが呼ばれる。
ViewController.m
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
NSLog(@"今日、監視をはじめます。");
[self.locationManager requestStateForRegion:self.beaconRegion];
[self.locationManager requestStateForRegion:(CLBeaconRegion *)region];
}
その後は1秒間隔くらいで領域にいるかどうか探し続けて、いればdidRangeBeaconsが呼ばれる
ViewController.m
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
for (CLBeacon *beacon in beacons) {
NSLog(@"ビーコンID %@", beacon.proximityUUID);
NSLog(@"ビーコンの位置: %@",beacon.proximity);
// 色の変更
[self setColorForProximity:beacon.proximity];
// ラベルの変更
self.label.text = [self stringForProximity:beacon.proximity];
}
}
距離に応じて画面の色とメッセージを変更することにする。
ViewController.m
// カラーを変更する処理
- (void)setColorForProximity:(CLProximity)proximity {
switch (proximity) {
// どこにあるのかわからん
case CLProximityUnknown:
self.view.backgroundColor = [UIColor whiteColor];
break;
// 遠いけどたしかにそこにある
case CLProximityFar:
self.view.backgroundColor = [UIColor orangeColor];
break;
// ほどほど近い
case CLProximityNear:
self.view.backgroundColor = [UIColor blueColor];
break;
// すごく近い
case CLProximityImmediate:
self.view.backgroundColor = [UIColor redColor];
break;
default:
break;
}
}
// メッセージを変更する
- (NSString *)stringForProximity:(CLProximity)proximity {
switch (proximity) {
case CLProximityUnknown: return @"何だこれは!木の根がこんな所まで!";
case CLProximityFar: return @"黒い石だ!!伝承の通りだ!!";
case CLProximityNear: return @"読める!!読めるぞ!!";
case CLProximityImmediate: return @"バルス!!";
default:
return nil;
}
}
そんなわけで、iBeaconとの距離によって表示を変更させてみた結果
CLProximityUnknown:
(http://skylarking.me/wp-content/uploads/2014-10-08-white.png) まだ見つかっていない状態
CLProximityNear: 近くにあるよ!という状態。
CLProximityImmediate: ものすごく近いよ、という状態
とりあえず今日はここまで。iOS7.1以降はバックグラウンドから起動できるっぽいのでそれを後日やる。