2014年7月12日土曜日

[iOS]BLE(peripheral manager・central manager)のerrorなどのあるある まとめ

[随時アップデートしていきます]


1.CBPeripheral is being dealloc'ed while connecting

これは、disconnected→connecting → connectedする過程の
connecting中に起きたもの。
connectingしている最中に、別のperipheralを保存されたため、
いったんdeallocされ、connecting状態で停止する。
[対処法]
scanをstopするか、connecting中になにかperipheralをインスタンスで保持しない対処が必要
ついでに、このときに、error code:1309がよく出る。
基本的には、_peripheralのretainする位置を間違えているか、上記が理由。


2.didConnectedしたものの、すぐにdid disconnected peripheralが呼び出される。

エラーはこんな感じで吐き出される。
Error Domain=CBErrorDomain Code=7 "The specified device has disconnected from us." UserInfo=0x178a79a00 {NSLocalizedDescription=The specified device has disconnected from us.}
これはbreakpointで止めたときに出てくる。
[対処法]
breakpointをはずす。たまにそれ以外でも出るときがある。笑


3.Error Domain=CBATTErrorDomain Code=7 "The offset is invalid." UserInfo=0x170463400 {NSLocalizedDescription=The offset is invalid.}

こりゃ一度に送れるデータ量を超えている場合。
valueに仕込むデータを20バイト以下に区切って送信すること。


4.Notifyとsubscribeで設定した場合に、長時間接続しているとdisconnectedして次につなげられない

自分からdisconnect peripheralを宣言して(それかdid disconnect peripheralの中で)、再びscanPeripheralなり、retrievePeripheralなりした方がよい。


5.readRequestで得られる情報は、512bytesのみ。(送られたデータは536bytes)

800bytesのデータを送ろうとして終わった。
もし、512bytes以上のデータを送りたい場合には、subscribe (Notifyを使う)してくださいねってことでした。


6. bluetooh-peripheralでバックグラウンドを実装

公式に書かれているが、info.plistのUIBackgroundModesにbluetooth-peripheralを宣言することで、バックグラウンドで実行できるようになる。ただ、フォアグランド用に作っていた場合、以下で異なる。
・CBAdvertisementDataLocalNameKeyが無視される(設定しても意味ない)
・明示的にUUIDを指定しないと検出できない
・全てをバックグラウンドに設定すると、バックグラウンドの制約により送出頻度が落ちる可能性がある
とのことでした。
バックグラウンドで実行してみた結果、
立ち上げた状態で今までは20秒ごとにdisconnectedが呼ばれていたが、
バックグラウンドにして最初呼ばれるのが約4分30秒でdisconnectが呼ばれるようになった。それ以降はもっと長い周期に入るみたい。




[ここまで感想]
データ量が限られているから、結局サーバーをつないでって流れはかわらないな・・笑