iPodTouchをスリープ状態にするとiOSがアプリの動作を止めてしまいますが、今回開発するアプリは常時hubotからのデータを受け取れるようにする必要があるので、これでは困ってしまいます。そこで、今回、BLEとSocket.ioをバックグラウンドになっても使える(接続を維持する)ような対応をしました。
概要としては、BLEは、Info.plistの UIBackgroundModesに "bluetooth-central" (Uses Bluetooth LE accessories) を設定し、バックグラウンドになる前にペリフェラルとの接続をしておけば、バックグラウンドになっても通信できるようになるようです。
Socket.ioは、アプリのInfo.plistにUIBackgroundModesキーでvoipを指定しておいて、下記のようにSocketIOClientインスタンスのVoipEnableをtrueにすれば良いようです。バックグラウンドになると、Ping(heartbeat)が送られないようで、サーバでheartbeatのタイムアウトにより切断されるみたいですが、iphoneアプリのSocket.ioは自動的に再接続してくれるようです。
socket = SocketIOClient(socketURL: SocketURL!, options:[.ForceWebsockets(true), .VoipEnabled(true), .ReconnectWait(5)])