2014年2月10日月曜日

続 WebSocket for Android (Cordova/PhoneGap Plugin)

気が付けばブログ更新がほぼ1年ぶりという...。
しかも内容が前回記事のアップデート、Cordova/PhoneGap の Android 向け WebSocket プラグインのお話。

Cordova/PhoneGap がバージョン3になって、環境周りが大きく変更されました。
それに伴ってプラグインの導入方法や開発方法も変更になり、以前作ったバージョン2向けのプラグインが使えなくなってしまったのですが、バージョン3がリリースされた当時(記憶では2013年の夏だったかと)仕事が超絶忙しく、全然キャッチアップできていませんでした。
Android 向けの WebSocket プラグインは私の他にも公開されている方がいらっしゃるのですが既にバージョン3対応済み。完全に出遅れです。
それで、ようやく時間が作れるようになったので、自分のプラグインをバージョン3対応してみることにしたのでした。

何が変わったのか


バージョン3では開発環境がNode.jsベースになりました。Android の場合でいうと、Eclipse などの IDE さえ不要になりました。この変更が一番大きいですね。
プラグインの導入については、以前は必要なファイルを手動で自分のプロジェクトにコピーしていましたが、コマンドを叩くことで自動的に取り込まれるようになりました。プラグイン導入のコマンドは以下のような感じです。
cordova plugin add プラグインのURL
または
phonegap plugin add プラグインのURL
これらの変更は、ターゲットOSの開発環境(手法)に精通していなくてもそのOS向けにアプリをビルドできる、という恩恵をもたらしてくれます。
ただ、この新しい開発環境はまだまだこれからだなという印象です。特に、現時点では PhoneGap (の存在)が微妙です。PhoneGap は簡単にいえば Adobe 版 Cordova で、Cordova との明確な違いは PhoneGap Build に対応していることぐらいしかないのですが、各種コマンドの文法を微妙に変えていたり、その一方で、ファイル名だけ PhoneGap に変えただけのものがあったりします。この中途半端な独自性が災いして、サンプルアプリを動かしただけなのに「cordova.js が見つかりません」などという警告が出たりします。

新しい WebSocket for Android


プラグインのバージョン3対応は、つまりはこの新しいプラグイン導入コマンドに対応することです。
Android 向けのプラグインについていえば、名前空間に若干の変更が入りましたが、インターフェースそのものは以前から変わっていません。
変更点としては plugin.xml というマニフェストを用意する必要があるぐらいです(この定義ファイルをコマンドが解釈し、従来手動で行っていたファイルのコピーなどが自動化されます)。
そのため従来のプラグインをそのままバージョン3対応することはそんなに難しくありませんでした。ただ、プラグイン自体が現在の WebSocket 仕様と違っている部分があったり、テキスト送受信にしか対応していなかったりで、ただバージョン3対応するだけではイマイチな状況。そこで今回は、

  • インターフェースを現在の WebSocket 仕様になるべく準拠させること
  • その上でバイナリ送受信にも対応させること

を目指しました。
過去のバージョンのことなので詳細は省きますが、インターフェース部分は以前に比べだいぶ WebSocket 仕様に近づいたと思います(複数サブプロトコルや ready state、bufferedAmount など、まだ対応すべき部分は残っていますが)。

そして今回一番大きな追加機能であるバイナリ送受信。
はじめに書いてしまいますが、プラグインでのバイナリ送受信はあまりメリットがありません。。
プラグイン(JavaScript)とネイティブ(Java)との間では文字列しかやり取りできないので、バイナリは一旦 base64 でエンコードしなければならないからです。これを送受信両方で行うのです。テキスト送受信と比較したときの速度面でのアドバンテージはほとんどありません。これは WebView の宿命ともいうべき仕組み上の限界です。
まあ、ネイティブ WebSocket のフォールバックとして、バイナリ送受信もできるということに一定の価値はあるとは思いますけどね。
そうそう、ネイティブといえば、Android 4.4 から標準ブラウザが Chromium ベースに変更されたことに伴い プラグインなしで WebSocket が使えるようになりました。4.4 以降がシェアの大半を占めるようになったとき(何年後?)、本プラグインはその役割を終えるでしょう。。

詳しい使い方は GitHub をご覧いただけたら幸いです。できない英語を無理強いしているためツッコミどころ満載かとは思いますが、その際はそっとご指摘いただきたく存じます。。

0 件のコメント:

コメントを投稿