iOSアプリでWebSocketを利用する ~ SocketRocketでハマる
iOSアプリでWebSocket通信を行うのにSocketRocketというライブラリがGitHubにあったので使ってみることにしました。
そこで1つハマっていたことがあって解決したので共有しておきます。
node.jsを使って簡単にWebSocket Serverを構築して、iOSのシミュレータで接続&切断を試していたところどうもnode.jsで起動したサーバがエラーで落ちる模様。
node.js側は、wsってのをnpmからインストールして使いました。
そこでこんな感じでエラーをハンドリングできることがわかったのでコード追加。
ws.on('error', function(e) {
console.log('error: %s', e);
});
エラーの内容は、「invalid error code」であることがわかりました。
ただサラッと調べた感じだとわからなくて、切断しなければ問題発生しないんでしばらく放置していました。
が、やっぱり気になるので調べていたらpull requestの中に答えを見つけました!
https://github.com/square/SocketRocket/pull/157
なんと、SocketRocketのcloseメッソドが実装しているclose codeが不正な値だと書いてある。。
SocketRocket uses the invalid close code -1 as the value in the default close method.
RFCに従うと1000が正しいらしい、ということで手元のソースを書き換えてビルドしなおしたらエラーを吐かずに動くようになりました。
早く気づけよ自分。。