まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

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

参考にした記事