8

Apple の「BTLE Transfer」サンプル プロジェクトを使用して CoreBluetooth プログラミングを理解しようとしています。iOS 6 デバイスを Central として使用するとアプリは正常に動作しますが、iOS 7 デバイスを Central として同じアプリを実行すると動作しません。ペリフェラルは 2 つのパケットの後に送信を停止し、セントラルはそれらのいずれも受信しません。

唯一の手がかりは、iOS 7 で実行している場合にのみ表示される次の警告です。

CoreBluetooth[WARNING] <CBCentralManager: 0x15654540> is disabling duplicate filtering, but is using the default queue (main thread) for delegate events

このアプリを iOS 7 に対応させるには、何を変更する必要があるか教えてもらえますか?

編集:両方のデバイスが iOS7 の場合、問題はありません。これは、iOS7 セントラルが iOS6 ペリフェラルと通信している場合にのみ壊れます。

4

2 に答える 2

8

さて、iOS 6周辺機器の中心にあるiOS 7で実行しました。重複フィルタリングの無効化に関する警告を消したい場合は、別のスレッドで実行してください。次のようにします。

dispatch_queue_t centralQueue = dispatch_queue_create("com.yo.mycentral", DISPATCH_QUEUE_SERIAL);// or however you want to create your dispatch_queue_t
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueue];

これで、重複を有効にしてスキャンできるようになります。ただし、クラッシュせずにテキストを設定できるようにするには、メイン スレッドで textView セッターを呼び出す必要があります。

dispatch_async(dispatch_get_main_queue(), ^{
    [self.textview setText:[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]];
        });

ところで、おそらく新しい iOS 7 デリゲートの初期化も採用する必要があります。

_centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:centralQueue options:nil];//set the restoration options if you want

(iOS のバージョンを確認し、適切な初期化メソッドを呼び出すだけです)

于 2013-09-24T17:18:40.737 に答える
5

scanForPeripheralsWithServices:options:で設定した場合は、重複するフィルタリングなしでスキャンを実行する必要があることを意味するCBCentralManagerScanOptionAllowDuplicatesKey:@YESように変更し ます。CBCentralManagerScanOptionAllowDuplicatesKey:@NO

私にとっては、iOS7 でも動作します。

于 2014-02-26T07:12:07.913 に答える