$ uuidgen
iBeacon受信処理を行うクラスにおいて、CoreLocationをインポートした上でCLLocationManagerDelegateプロトコルを実装(適合)する。各メソッドの意味等については下記コード内のコメントを要参照。
@implementation BLGViewController
- (void)viewDidLoad
{
[super viewDidLoad];
if ([CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// identifierについては、アプリ内でどのリージョンであるかを判別するために使用
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:BLGViewControllerProximityUUID];
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:kIdentifier];
// いずれもデフォルト設定値
self.beaconRegion.notifyOnEntry = YES;
self.beaconRegion.notifyOnExit = YES;
self.beaconRegion.notifyEntryStateOnDisplay = NO;
// 領域観測を開始する
[self.locationManager startMonitoringForRegion:self.beaconRegion];
}
}
#pragma mark - CLLocationManagerDelegate
// 領域観測が正常に開始されると呼ばれる
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
// 非同期に実行し、CLLocationManagerDelegateに結果を配送する
// (locationManager:didDetermineState:forRegion:メソッド要実装)
[self.locationManager requestStateForRegion:self.beaconRegion];
}
// 領域に関する状態を取得する
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
switch (state) {
case CLRegionStateInside:
NSLog(@"state is CLRegionStateInside");
self.stateLabel.text = @"CLRegionStateInside";
// 領域内にいるので、測距を開始する
if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) {
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
break;
case CLRegionStateOutside:
NSLog(@"state is CLRegionStateOutside");
self.stateLabel.text = @"CLRegionStateOutside";
break;
case CLRegionStateUnknown:
NSLog(@"state is CLRegionStateUnknown");
self.stateLabel.text = @"CLRegionStateUnknown";
break;
default:
NSLog(@"state is UNKNOWN");
self.stateLabel.text = @"UNKNOWN";
break;
}
}
// 領域に入ると呼ばれる
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
// 領域に入ったので、測距を開始する
if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) {
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
}
// 領域から出ると呼ばれる
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) {
[self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
}
}
// 領域内でビーコンを受信する度に呼ばれる(実機で確認する限りでは約1秒毎)
// ビーコンの状態が変わった時も呼ばれる
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
if ([beacons count] > 0) {
// 最も近くにあるビーコンが配列の先頭にあるように、デバイスからの距離によって整列されている
CLBeacon *nearestBeacon = beacons.firstObject;
NSString *proximityStr;
switch (nearestBeacon.proximity) {
case CLProximityImmediate:
proximityStr = @"CLProximityImmediate";
break;
case CLProximityNear:
proximityStr = @"CLProximityNear";
break;
case CLProximityFar:
proximityStr = @"CLProximityFar";
break;
case CLProximityUnknown:
proximityStr = @"CLProximityUnknown";
break;
default:
proximityStr = @"UNKNOWN";
break;
}
// ビーコン識別情報
self.uuidLabel.text = nearestBeacon.proximityUUID.UUIDString;
self.majorLabel.text = [NSString stringWithFormat:@"%@", nearestBeacon.major];
self.minorLabel.text = [NSString stringWithFormat:@"%@", nearestBeacon.minor];
// アドバタイズしているビーコンまでの距離に関する情報
self.proximityLabel.text = proximityStr;
self.rssiLabel.text = [NSString stringWithFormat:@"%ld [dB]", (long)nearestBeacon.rssi];
self.accuracyLabel.text = [NSString stringWithFormat:@"%.0f [m]", nearestBeacon.accuracy];
}
}
// アプリのロケーションサービスに関するアクセス許可状態に変更があると呼ばれる
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
NSLog(@"%s", __func__);
switch (status) {
case kCLAuthorizationStatusAuthorized:
NSLog(@"kCLAuthorizationStatusAuthorized");
break;
case kCLAuthorizationStatusRestricted:
NSLog(@"kCLAuthorizationStatusRestricted");
break;
case kCLAuthorizationStatusDenied:
NSLog(@"kCLAuthorizationStatusDenied");
break;
case kCLAuthorizationStatusNotDetermined:
NSLog(@"CLAuthorizationStatusNotDetermined");
break;
default:
NSLog(@"UNKNOWN");
break;
}
}
@end
[参考URL]
[iOS 7] 新たな領域観測サービス iBeacon を使ってみる
iBeaconの解説
