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が呼ばれるようになった。それ以降はもっと長い周期に入るみたい。
[ここまで感想]
データ量が限られているから、結局サーバーをつないでって流れはかわらないな・・笑