ビーコン メッセージを受信する

アプリは、近くにある他のデバイスによって公開されたメッセージを定期購読するために使用されるメカニズムを使用して、Bluetooth Low Energy(BLE)ビーコン メッセージを定期購読できます。

デフォルトでは、ビーコン サブスクリプションはアプリがフォアグラウンドにある場合にのみ機能します。アプリがバックグラウンドに移行すると、サブスクリプションはビーコンのスキャンを自動的に停止します。バックグラウンド スキャンを有効にする方法については、バックグラウンド スキャンをご覧ください。

ビーコンを定期購読するには、定期購読パラメータで deviceTypesToDiscover パラメータを kGNSDeviceBLEBeacon に設定します。次のスニペットは、これを行う方法を示しています。

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
    })

上記のサブスクリプションは、プロジェクトが所有するビーコンのみを検出し、それらのビーコンからすべてのメッセージを受信します。別の Namespace で登録されたビーコンからメッセージを受信する場合は、サブスクリプション パラメータで Namespace を渡すことができます。同様に、特定の種類のメッセージを取得するには、フィルタ用のメッセージ タイプを渡すこともできます。次のスニペットは、その方法を示しています。

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.messageNamespace = @"com.mycompany.mybeaconservice";
                              params.type = @"mybeacontype";
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.messageNamespace = "com.mycompany.mybeaconservice"
      params.type = "mybeacontype"
    })

デフォルトでは、ビーコン サブスクリプションは Eddystone と iBeacon の両方のビーコンをスキャンします。iBeacon スキャンが有効になっている場合、アプリが位置情報を使用するための権限を付与するようユーザーに求めるメッセージが表示されます。アプリの Info.plist には、位置情報が使用される理由の簡単な説明とともに NSLocationWhenInUseUsageDescription キーを含める必要があります。詳しくは、Apple のドキュメントをご覧ください。

Eddystone ビーコンのみをスキャンする場合は、GNSBeaconStrategy で iBeacon スキャンを無効にできます。この場合、iOS はユーザーに位置情報の使用許可を求めません。次のスニペットは、上記の元の定期購入の iBeacon スキャンを無効にする方法を示しています。

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                  };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
          })
    })

デフォルトでは、低電力のスキャンが有効になっています。これにより、Eddystone ビーコンの検出時にレイテンシが長くなることがあります。低電力モードが無効になっている場合は、iBeacon スキャンを使用して Eddystone ビーコンを検出するため、レイテンシを短縮できます。ただし、この方法ではバッテリーの使用量が増え、iOS から位置情報の使用許可を求められます。

次のスニペットは、Eddystone ビーコンをスキャンするときに低電力モードを無効にする方法を示しています。

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                    params.lowPowerPreferred = NO;
                                  };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
            params.lowPowerPreferred = false
          })
    })

iBeacon をスキャンする場合、iOS の位置情報の利用許可ダイアログの前に、近くのデバイスの利用許可ダイアログが表示されます。このダイアログをオーバーライドする場合(位置情報の権限が必要な理由を説明する「プリフライト」ダイアログを表示する場合など)は、サブスクリプション パラメータで permissionRequestHandler をカスタム ブロックに設定します。次のスニペットは、これを行う方法を示しています。

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
                                // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
                                permissionHandler(userGavePermission);
                              };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler!) in
        // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
        permissionHandler(userGavePermission);
      }
    })

バックグラウンド スキャン

ビーコン スキャンは BLE を使用するため、バックグラウンドで動作できます。バックグラウンド モードを使用するかどうかを判断する際には、次の点に注意してください。

  • バックグラウンド BLE ではバッテリーの消費量が増加します。費用は低いですが、バックグラウンド モードを使用するかどうかを判断する前に測定する必要があります。
  • iBeacon スキャンが有効になっている場合や、低電力モードが無効になっている場合、iOS はバックグラウンドで位置情報を使用する権限をユーザーに求めます。

バックグラウンドでビーコン スキャンを有効にするには、次の手順を追加します。

  • 適切に構成された GNSBeaconStrategy オブジェクトを渡して、定期購入のバックグラウンド モードを有効にします。次のスニペットは、その方法を示しています。

    Objective-C

    id<GNSSubscription> beaconSubscription = [messageManager
        subscriptionWithMessageFoundHandler:myMessageFoundHandler
                         messageLostHandler:myMessageLostHandler
                                paramsBlock:^(GNSSubscriptionParams *params) {
                                  params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                                  params.beaconStrategy = [GNSBeaconStrategy
                                      strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                        params.allowInBackground = YES;
                                      }];
                                }];
    

    Swift

    let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
        myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
        paramsBlock: { (params: GNSSubscriptionParams!) in
          params.deviceTypesToDiscover = .BLEBeacon
          params.beaconStrategy =
              GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
                params.allowInBackground = true
              })
        })
    

  • 必要なエントリをアプリの Info.plist に追加します。

    • UIBackgroundModes エントリ:

      • bluetooth-central: バックグラウンドでの BLE スキャン。
      • location: 高電力モードを使用してバックグラウンドで iBeacon をスキャンします。Eddystone ビーコンのみの低電力スキャンの場合は、省略できます。
    • NSLocationAlwaysUsageDescription バックグラウンドでユーザーの位置情報を追跡する理由を説明する文字列。たとえば、「バックグラウンドでビーコンをスキャンするために位置情報が必要です」などです。詳しくは、Apple のドキュメントをご覧ください。Eddystone ビーコンのみの低電力スキャンの場合は、省略できます。

  • ユーザーはアプリでバックグラウンド スキャンを有効または無効にできますか?その場合は、バックグラウンド モードの値を NSUserDefaults に保存する必要があります。iOS では、バックグラウンドで実行中のアプリがいつでも強制終了される可能性があるためです。アプリは次の処理を行う必要があります。

    • ユーザーが変更するたびに、バックグラウンド モードの値を NSUserDefaults に保存します。
    • 起動時に NSUserDefaults から読み取り、バックグラウンド モードが有効になっている場合はビーコン サブスクリプションを復元します。

バックグラウンド通知

バックグラウンドでビーコンが検出されたときにアプリからユーザーに通知するには、ローカル通知を使用します。詳しくは、バックグラウンド通知をご覧ください。