アプリは、他の周辺デバイスから公開されたメッセージの登録に使用されるのと同じメカニズムを使用して、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 の位置情報の利用許可ダイアログの前に Nearby の利用許可ダイアログが表示されます。 このダイアログをオーバーライドする場合(たとえば、位置情報の利用許可が必要な理由を説明する「事前確認」ダイアログを表示する場合)は、登録パラメータで 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エントリ:- バックグラウンドでの BLE スキャン用の
bluetooth-central。 - 高電力モードを使用したバックグラウンドでの iBeacon スキャン用の
location。Eddystone ビーコンの低電力スキャンのみを行う場合は、省略できます。
- バックグラウンドでの BLE スキャン用の
NSLocationAlwaysUsageDescription。バックグラウンドでユーザーの位置情報をトラッキングする理由を説明する文字列。 例: 「バックグラウンドでビーコンをスキャンするには、位置情報が必要です。」 詳しくは、 Apple のドキュメント をご覧ください。Eddystone ビーコンの低電力スキャンのみを行う場合は、省略できます。
ユーザーがアプリでバックグラウンド スキャンを有効または無効にすることはできますか? できる場合は、バックグラウンド モードの値を
NSUserDefaultsに保存する必要があります。iOS は、アプリがバックグラウンドにあるときにいつでもアプリを強制終了できるためです。 アプリは次のことを行う必要があります。- ユーザーがバックグラウンド モードの値を変更するたびに、その値を
NSUserDefaultsに保存します。 - 起動時に、
NSUserDefaultsから値を読み取り、バックグラウンド モードが有効になっている場合はビーコンの登録を復元します。
- ユーザーがバックグラウンド モードの値を変更するたびに、その値を
バックグラウンド通知
アプリがバックグラウンドでビーコンが検出されたときにユーザーに通知する場合は、 ローカル通知を使用できます。詳しくは、 バックグラウンド通知をご覧ください。