iPhoneでPeripheralを作った時にCentralから検出できない問題

以前Peripheralの記事を書きましたが、久々にPeripheralを作る機会があり、iPhone同士で通信を行った際にどハマりしたことがあるのでメモとして残しておきます。

問題の原因

タイトル通りなのですが、PeripheralのGATTをなにかしらいじった後Central側でスキャンをしてもServiceを見つけることができません。

LightBlueで確認するとなぜか見えていたので、それも合間ってどハマりしていました。(LightBlueがで来ているので、何かしらの対処策はあるはず)

問題はPeripheralのキャッシュが残っていて値がうまく反映されていないのです。

対処法

ダメなキャッシュクリア

下スワイプ で表示されるタブのBluetoothボタンの切り替えは1日Bluetoothと接続しないというものなので、大元のBluetoothはOFFになっておらずキャッシュが残ったままになってしまいます。

正しいキャッシュクリア

設定画面のBluetoothを切り替えてキャッシュを削除してあげることで正常に動くようになります。

Peripheralの名前などもそうですが、CBPeripheral周りを作成する際はキャッシュが残って動かなくなってしまうことが多いので気をつけましょう!

※追記

キャッシュをいくら消しても治らない問題にぶちアタあって解決策を探したら見つかりました。

GATTの変更があった場合処理が終わった後以下のメソッドに飛んでくるのでここでもう一度discoverServiceを呼ぶことでキャッシュを殺して最新のserviceを探すことができます!

    func peripheral(_ peripheral: CBPeripheral, didModifyServices invalidatedServices: [CBService]) {
        //ここでdiscoverServiceを呼ぶ!
    }

参考文献

Core Bluetoothのハマりどころ逆引き辞典