デバイスを周辺機器用にスキャンし、周辺機器としてアドバタイズするようにアプリをセットアップしようとしています。目標は、2つのデバイスがBluetoothの発見によって互いに近づいたときに、バックグラウンドでウェイクアップされることです。 Appleドキュメンテーションから、BLEをバックグラウンドで実行できるはずです(bluetooth-centralおよびbluetooth-peripheralバックグラウンドモードが有効になっている)。フォアグラウンド。まず、次のようにデータを宣伝します。
NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"my-peripheral",
CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:identifier]]};
// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData];
次に、データをスキャンするようにデバイスを設定します。
NSArray *services = @[[CBUUID UUIDWithString:identifier]];
[centralManager scanForPeripheralsWithServices:services options:nil];
ただし、両方がバックグラウンドに入ると(デバイスをロックする必要があります)、Bluetoothは検出できず、
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
どちらのデバイスでも呼び出されません。どうすれば修正できますか?ありがとう
あなたがしようとしていることはうまくいきません。私は同じことを達成しようとしました。
問題は、フォアグラウンドとバックグラウンドでのスキャンの違いです。フォアグラウンドでデバイスをスキャンしているときは、何でもスキャンできます。バックグラウンドで、スキャンする実際のサービスUUIDを指定する必要があります。探しているUUIDを知っているので、これは実際には問題ではありません。
周辺機器:周辺機器としてのブロードキャストは、フォアグラウンドとバックグラウンドで動作が異なります。フォアグラウンドでは、通常のBT周辺機器と同じように機能します。バックグラウンドでは、使用できるスペースが非常に限られているため、周辺機器のUUIDは非表示になり、ブロードキャストされません。中央デバイス(フォアグラウンドのiPhone)が中央デバイスから情報を要求した場合にのみ、アプリが起動され、UUIDが表示されます。
つまり、2は互いにキャンセルします。バックグラウンドスキャンは特定のUUIDを持つデバイスのみをスキャンでき、バックグラウンドペリフェラルはそのUUIDをアドバタイズできないため、お互いを認識できません。
デバイス(ペリフェラルまたはセントラルのいずれか)が動作するには、フォアグラウンドにある必要があります。
これは、Apple Bluetoothメールリストで何度も議論されています。
理論的には動作するように見えるので、これをテストする方法について詳しく説明する必要があります。あなたが直面しているかもしれない2つの主要な問題があります:
1。)iOSデバイスがバックグラウンドで実行されている場合、スキャンは抑制されます。
2。)バックグラウンドに入る前に、デバイスがすでにお互いを検出している可能性があります。
CBCentralManagerScanOptionAllowDuplicatesKey
スキャンフラグを無効にします。このフラグを指定していないので、デフォルトでNOに設定されています。したがって、お互いを一度見ただけでも、バックグラウンドにいるときは別のコールバックを取得できません。私は個人的にそのような機能を必要としていて、オープンソースコンポーネントを開発しました: https://github.com/omergul123/Discovery
ピアアプリがバックグラウンドで実行されている場合でも、IDを交換する場合に非常に役立ちます。