iosアプリで常時接続のシリアル通信を長時間実行する方法
シリアル通信で外部機器のログを取るiOSアプリを作ろうとしたときのメモ。
iOS8以降では、バックグラウンドでの通信の場合は、NSURLSessionでBackground Fetchを使うのが一般的。
しかしHTTP/HTTPS通信しかできないようだし、実行タイミングも10~40秒間隔になってしまうようなので、リアルタイムに近い頻度で受信できないと思ったのであきらめた。
フォアグラウンドであれば、CFStreamCreatePairWithSocketToHost()等を使ってシリアル通信できるので、仕様を実現できる。
ただし、ホームボタンが押されてバックグラウンドに行ってしまうと通信が一時停止してしまう。
これを防ぐのに、iOSのアクセスガイド機能を利用してホームボタンや電源ボタンを効かないように設定した。
これでアプリをフォアグラウンドから動かす操作ができなくなる。
あと一定時間操作しないとスリープに入ってしまうが、これはアプリの処理でスリープしないようにフラグを設定すればスリープしなくなる。
アプリ実行中に他の作業ができなくなってしまうのと、ユーザーに操作してもらう手間があるのがデメリットとして残ってしまうが、ベターな方法ではないかと思います。
他にいい方法があれば教えて下さい。