iBeacon(4) - バックグラウンド動作中にロック画面に通知を表示してみよう

iBeaconが魅力的な点の一つはアプリケーションがバックグラウンドでもリージョン検知の通知を受け取ることができることです。

まずはロック画面にリージョンに入った時と出たときに通知を表示してみましょう。

CLBeaconRegionのpropertyで、どういった場合に通知を受け取りたいかの設定ができます。iOS7ではCLBeaconRegionに3種類のpropertyがあり、それぞれ

  • notifyOnEntry (default YES)
  • notifyOnExit (default YES)
  • notifyEntryStateOnDisplay (default NO)

となっています。何も設定しないと、リージョンに入った時と出た時に通知がきますので、まずはdefaultの設定で試してみましょう。

最初にリージョン監視をして、通知を受け取れるようにします。この部分はすでにこれまでのエントリーで触れていますので割愛します。サンプルコードでは、リージョンの通知を受けたら、didUpdateRegionEnterOrExitというdelegateを呼ぶようにしていますので、そこで、

- (void)enterRegionNotification:(ESBeaconRegion *)region
{
    // LocalNotification.
    if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) {
        UILocalNotification *notification = [[UILocalNotification alloc] init];
        notification.alertBody = [NSString stringWithFormat:@"Entered to %@", region.identifier];
        [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
    }
}

- (void)exitRegionNotification:(ESBeaconRegion *)region
{
    // LocalNotification.
    if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) {
        UILocalNotification *notification = [[UILocalNotification alloc] init];
        notification.alertBody = [NSString stringWithFormat:@"Exit from %@", region.identifier];
        [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
    }
}

- (void)didUpdateRegionEnterOrExit:(ESBeaconRegion *)region
{
    if (region.hasEntered) {
        [self enterRegionNotification:region];
    } else {
        [self exitRegionNotification:region];
    }
}

このようにアプリがフォアグラウンドでない場合にLocalNotificationをPushするようにします。これでスクリーンショットのように、リージョンに入ったり出たりした時に通知を表示することができます。

では次に、ユーザが画面表示した瞬間に通知を受け取るように設定しましょう。それにはnotifyEntryStateOnDisplayをYESにして、notifyOnEntryをNOにします。

    CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:kBeaconUUID] identifier:kIdentifier];
    region.notifyOnEntry = NO;
    region.notifyEntryStateOnDisplay = YES;
    region.notifyOnExit = YES;

このように設定することで画面が表示された時にEntryの通知がされるようになります。リージョンに入るたびに通知がくるのが煩わしいケースはこのような設定で回避することができます。レジでポイントカードの確認をするアプリなどに活用できるのではないでしょうか。