iBeaconのエントリポイント
1. Beaconに関するCLLocationManagerを作成する
// 以下のメソッドの内容をinit系の処理で呼び出す - (void)initLocaitionService { // CLBeaconRegionを作成 // このとき、ProximityUUIDは、beacon製品で提供されたUUIDを使用する。 // identifierについては、何でもよいので、bundleIdentifierを指定しておく。 // CLBeaconRegionは別にプロパティとして保持しておく必要はない。 CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:/* your NSUUID */ identifier:[NSBundle mainBundle].bundleIdentifier]; // iBeaconを受信するlocationManagerを生成し、デリゲートを設定する // CLLocationManagerはdelegateで渡ってくるのでプロパティにする必要ないかと思ったが、 // プロパティにして保持しておかないとreleaseされてしまうようだ。そのため、プロパティにしている self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; // iBeaconに対応しているかを調べる if(![CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) { return; } // beaconのranging機能が使用可能かを調べる // rangingというのは、beaconの機能で距離を計測する機能みたいなもの if (![CLLocationManager isRangingAvailable]) { return; } // beaconの観測開始 // そもそも、beaconには、regionという概念とrangingという概念があるが、 // まずは、regionについてモニタリングを始める [self.locationManager startMonitoringForRegion:beaconRegion]; }
2. beaconの観測が正常に開始されたことを知らせるdelegateメソッドが呼ばれる
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { // region内にすでにいる場合に備えて、必ずregionについての状態を知らせてくれるように要求する必要がある // このリクエストは非同期で行われ、結果は locationManager:didDetermineState:forRegion: で呼ばれる [manager requestStateForRegion:region]; }
3. beaconがリージョン内でどういう状態にあるかを知らせるdelegateメソッドが呼ばれる
// beaconのリージョンという概念に関する状態を取得するdelegateメソッド -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { switch (state) { case CLRegionStateInside: // 領域内にいるので、beaconの距離計測(ranging)を開始する if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) { [manager startRangingBeaconsInRegion:(CLBeaconRegion *)region]; } break; case CLRegionStateOutside: break; case CLRegionStateUnknown: break; default: break; } }
4. beaconの情報を断続的に知らせるdelegateメソッドが呼ばれる
// ビーコンの領域内にいるときに断続的に呼び出されるデリゲートメソッド // beaconsは距離が近い順に整列されたものが返却される - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { NSLog(@"beacons:%@", beacons); }
参考にした記事