被験者は本当にそれをすべて言います。ドキュメントは、それが存在する限り、iOSデバイスで実行されているCoreBluetoothフレームワークに対して作成されたアプリは、バックグラウンド特権リストに「bluetooth-central」を追加し、非アクティブながら何らかの種類のBluetoothイベントを処理できることを示唆していますが、どのexactイベントは配信されますか?
例えば:
誰も知らないようだったので、iOS開発者アカウントを購入し、いくつかの実験を行いました。私が見つけたものは次のとおりです。
フォアグラウンドで実行している場合、CBCentralManager :: scanForPeripheralsWithServicesを使用してスキャンを開始できます。スキャンは、制限付き特定のサービスをアドバタイズするデバイスに、または制限なし(そのコールのパラメーターにnilを渡す)にできます。 許可または重複を許可しない;前者の場合、iPhoneが広告パケットを受信するたびにdidDiscoverPeripheralコールバックを取得します。後者では、見つかったデバイスごとに1つのコールバックのみを取得します。
背景を入力すると、ルールは次のように表示されます。
サンプルデバイスが接続可能であるため、接続不可能なデバイス(近接プロファイルを実装しているようなBLE広告主など)への接続試行が十分であるかどうかはわかりません。ただし、少なくとも接続可能なデバイスの場合、このスキャン/接続/切断/スキャン手順は、バックグラウンドでのデバイスの存在をポーリングするのに十分です。
上記の結果は、iOS 5.0.1を実行しているiPhone 4Sを使用して収集されました
クリスの答えに加えて:
peripheral:didUpdateValueForCharacteristic:error:
)10分経ってもバックグラウンドで周辺機器から。したがって、バックグラウンドで継続的に実行する場合、2つのオプションがあります。
後でWWDC 2012 Core Bluetoothビデオの「イベントの背景」になるはずです https://developer.Apple.com/videos/wwdc/2012/ しかし、前者はハックのように見えます。それに依存する。
これをiPhone5、iOS6.1.4でテストしました
Appleはついに Core Bluetooth Programming Guide をリリースしました。ここに公式の注意事項があります
AppleはこれをCoreLocation機能と考えることを好むが、iBeaconsに関連するバックグラウンドおよびCoreBluetoothの動作に注意することもよい。
IBeaconリージョンの通知がオンになっている場合、リージョンの開始または終了をユーザーに通知します。これらの通知は、ディスプレイがオンかオフかによって異なります。これらの通知は、通知を要求するアプリがバックグラウンドにある場合でも機能します。 (これはドキュメントで明確になっています)。
それほど明白ではありません:iBeaconレンジングAPIを使用する場合、アプリは最前面になければなりません。ドキュメントでこれを明示的に言っているわけではありません。実際、レンジングはドキュメントのバックグラウンドで機能するはずだと誤解される可能性があります。ただし、Appleエンジニアは、これをApple開発者フォーラムの長いスレッドのどこかに埋められた投稿で明らかにしました。これも失敗しました。フォアグラウンドでのみ機能します。
IBeaconsを宣伝する周辺機器によって宣伝されている他のサービスを発見できます。ただし、これはフォアグラウンドでのみ機能します。そのため、iBeaconsを使用して中央に近接を通知し、他のBLEベースのサービスを使用して他のトランザクションを実行する場合、これは機能しますが、フォアグラウンドでのみです。バックグラウンドでは機能しません。バックグラウンドでBLEベースのサービスを使用するトランザクションの場合、広告はiBeaconではなく通常のBLE広告でなければなりません。バックグラウンドでの検出プロセスを支援するためにiBeaconアドバタイズメントを使用してから、バックグラウンドでBLEサービスを使用するように切り替えることはできません。 (私はこれが機能することを非常に気に入りましたが、サイコロはありませんでした)。
IOS8.3および8.4でBLEデバイスのバックグラウンドモードを学習しましたが、上記といくつかの違いが見つかりました。
始めたら
[centralManager scanForPeripheralsWithServices:@ [[CBUUID UUIDWithString:kServiceUUID]] options:@ {CBCentralManagerScanOptionAllowDuplicatesKey:@YES}];
から
- (void)applicationDidEnterBackground:(UIApplication *)application
列挙は、異なるRSSIを持つ呼び出しごとに同じデバイスを返すため、CBCentralManagerScanOptionAllowDuplicatesKeyは無視されません。