3

CoreBluetooth フレームワークを使用して、周辺機器として機能する iOS アプリと中央として機能する OS X アプリがあります。OS X アプリは iOS アプリに接続し、暗号化された特性を読み取ってランダムなコードを入力することで結合します。iOS アプリを再起動するまでは、すべて正常に動作します。それ以降、iOS デバイスに接続してその特性を読み取ろうとするたびに、「ハンドルが無効です」というエラーが返されます。これを修正する唯一の方法は、OS X の Bluetooth 設定からデバイスを削除し、結合プロセスを再開することです。

この問題は、デバイスのサービスと特性の OS X によるキャッシュが原因であると思われます。2 つの iOS デバイスを使用して 1 つを再起動した後に相互に接続している場合、問題は発生しません。

私が探しているのは、サービスと特性の OS X のキャッシュをクリアする方法です。com.apple.Bluetooth.plist を削除して blued プロセスを再起動/Bluetooth をオン/オフする方法に精通しています。( Bluedは ATT 値をキャッシュしますか? また、キャッシュをクリアする方法は?およびMacOS で CoreBluetooth キャッシュをクリアするにはどうすればよいですか? )

ただし、com.apple.Bluetooth.plist を削除するには、iOS デバイスに再度接続してコードを入力する必要があります。キャッシュをクリアする方法はありますが、アプリに関連するサービス/特性でのみそうしますか?

4

1 に答える 1

8

思ったより簡単だったことがわかりました。com.apple.Bluetooth.plist には、キャッシュされたサービスなどを含む辞書を含む CoreBluetoothCache キーがあります。トリッキーな部分は、全体に青く書かずにキャッシュを編集することでした。とにかく、これは(ターミナルで)行く方法です:

sudo defaults write /Library/Preferences/com.apple.Bluetooth CoreBluetoothCache -dict
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.blued.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.blued.plist

この後、CoreBluetooth は実際にサービスを再検出し、特性を正しい方法で読み取ります。

于 2014-05-09T20:21:16.483 に答える