BLEビーコン\周辺機器をスキャンしたいアプリにiOSによって適用される制限に関しては多くの混乱があります。いくつかのブログとStackOverflowの回答を読んだ後、すべての問題を正しく理解しているかどうかを確認したいと思います。誤解したり見逃したりしたことがあれば訂正してください。私はiOS7以降のみを参照し、接続ではなく検出に焦点を当てています(iBeacon Monitoring&Ranging APIを使用してCLBeaconに接続できますか?)。
ビーコンのオプションは明確です-汎用BLEペリフェラルを使用するか、 iBeacon形式 でアドバタイズするBLEペリフェラルを使用します(また、非標準のペリフェラルは、adv-でiBeaconフォーマットでアドバタイズできます。パケットおよびスキャン応答パケットの異なる形式)。
一般的な制限
didRangeBeacons
は、最近見つかったCLBeaconオブジェクトの配列を使用して毎秒呼び出されます。ビーコンからの距離とその精度は、Appleの開発者だけが実際に知っている機密アルゴリズムを使用してiOSによって計算されます(アルゴリズムは、ビーコンがアドバタイズするrssi値とrssi-at-1メートルのキャリブレーションバイトに基づいています)。 iBeacon Monitoringを使用して、リージョンに出入りするたびにデリゲートを呼び出すこともできます。ここでも、探しているProximityUUIDを指定する必要があります(メジャーとマイナーを指定することもできます)。 「リージョンの終了」は、広告を受信しない時間によって定義されるため、すぐに実行することはできません。デバイスごとに同時にレンジング/モニタリングできるリージョンの数は20に制限されています-これは、他のアプリが同時にモニタリング\レンジングを行う場合を意味します、アプリが監視\範囲を設定できない場合があります(右?)。フォアグラウンドでの実行-制限の少ないユースケース:
nil
のserviceUUIDs
にscanForPeripheralsWithServices
を渡すと、すべての周辺機器がスキャンされます。オプションでCBCentralManagerScanOptionAllowDuplicatesKey
をYES
として渡すと、同じ周辺機器\ビーコンに対してdidDiscoverPeripheral
が複数回呼び出されます(タイマーを使用すると、広告が検出されなかったと思います)しばらくの間受信し、ユーザーが「リージョン」を終了したと想定します)。バックグラウンドでの実行-より制限されたユースケース:
didEnterRegion
を呼び出し、アプリの実行時間を6秒にします。これにより、レンジングを開始できます(たとえば、メジャーとマイナーを検出するため)。 iOSはバッテリーの電力を維持するためにスキャンのオンとオフを切り替えるため、検出がすぐに行われない場合があります。同じProximityUUIDで複数のビーコンの領域に入り、特定のメジャーおよび/またはマイナーなしでこのUUIDを監視する場合、最初のビーコンからの信号の受信を開始すると、didEnterRegion
が呼び出されます。最初のビーコンの領域を終了せず、2番目のビーコンの領域にも入力したため、アプリは再度起動されないため(didEnterRegion
は再度呼び出されません)、2番目のビーコンを検出するためのレンジングを開始できません。ビーコンのメジャーとマイナー。アプリは単にフォアグラウンドにポップアップすることはできませんが、ローカル通知やその他のバックグラウンド操作を作成できます。scanForPeripheralsWithServices
によると、を使用してバックグラウンドで実行できますが、少なくとも1つのserviceUUIDを指定する必要があります。 didDiscoverPeripheral
には10秒の実行時間が与えられます。 CBCentralManagerScanOptionAllowDuplicatesKey
の使用は機能しません-didDiscoverPeripheral
はすべての周辺機器に対して1回呼び出されます。したがって、リージョンからの「終了」と「再入」を検出することはできません。この問題を解決するために、MACアドレスを変更する非標準のBLEペリフェラルを使用できると思います。アプリは単にフォアグラウンドにポップアップすることはできませんが、ローカル通知やその他のバックグラウンド操作を作成できます。 iOSはバッテリーの電力を維持するためにスキャンのオンとオフを切り替えるため、検出がすぐに行われない場合があります。アプリが強制終了された後に実行
誰かがこれらの制限についてもっと経験がありますか?いくつかのユースケースでは、scanForPeripheralsWithServices
をiBeaconモニタリングのより良い代替手段として使用できますか?
ありがとう!
あなたはほとんどあなたの説明に正しいです。たった2つの説明:
20リージョンの制限は、デバイスごとにnotであり、アプリ固有です。モバイルデバイスで他のアプリが何をしているかに関係なく、アプリはiOSによって最大20のリージョンを監視できます。とはいえ、ハードウェアの支援を受けてバックグラウンドで監視できるリージョンの数には、デバイス固有のハードウェア制限がある可能性があります。これらの制限は文書化されていません。これらの文書化されていない制限を超えると、バックグラウンドでビーコンが検出されるまでにかなり時間がかかる可能性があります。 (とはいえ、とにかく、いつ検出が行われるかについてのOSの保証はありません。)
Monitoring and RangingAPIを使用してCLBeacon
に接続することはできません。これらのAPIは、コネクションレス型のBLEアドバタイズパケットでのみ機能します。
はい、代わりにscanForPeripheralsWithServices
を使用することは可能です。これは、独自のシステムを実装するためにジンバルビーコンが行うことです。ただし、バックグラウンド検出時間と信頼性の点で実際の欠点があります。