質問: iOSおよびAndroidの標準ブラウザでも軽快に動く、リアルタイムなWebアプリ(チャットや、Googleドキュメントのような共同編集作業用のページ) を作るにはどうすればよいでしょうか? WebSocketが使えればいいのですが、スマートフォンの標準ブラウザは対応していないそうですね。
回答: リアルタイムWebの環境は、随分と整ってきてはいますが、まだ過渡期のためどこかで割り切りが必要です。 ご質問の内容からでは、詳細がわかりかねるため、判断材料になりそうな事柄を列挙します。 = スマートフォンのWebSocket対応について = iOSは、4.2.1以降でWebSocketに対応していますが、ドラフト版のhybi-00というバージョンになります。hybi-00では、テキストデータの送受信は可能ですが、バイナリデータには対応していないため、Base64化する等の工夫が必要です。また、死活監視に利用できるping/pong frameには対応していません。iOS6のSafariでは、RFC版のWebSocketが使えるようになっています。 Androidの4.0までの標準ブラウザは、ご質問にある通りWebSocketには対応していません。しかし、4.1以降はRFC版のWebSocketに対応したChromeが標準ブラウザになります。 = リアルタイムの定義と負荷について = 一概にリアルタイムと言っても、定義は人によりニュアンスが異なります。 33ms(=30fps)以下の場合もありますし、数百msや1秒前後のこともあります。 33ms以下は現時点のインターネットとスマートフォンのブラウザでは、不可能なのではないかというのが、私の個人的な理解です。 数百ms前後であれば、WebSocket一択かと思います。 1秒前後まで妥協できるのであれば、Cometも視野に入ってきます。 ただしCometは、WebSocketに比べて通信量が非常に多く、サーバ負荷も高いため、送受信するデータ量や送受信頻度には気をつけて下さい。 = フォールバックについて = WebSocketに対応しているブラウザならWebSocketを、対応していないブラウザではCometを使う、このような処理をフォールバックと言います。 サーバの環境が限定されてしまいますが、node.jsというサーバ上で使えるsocket.ioなら、フォールバックが可能です。 node.jsを使う場合、サーバ側をJavaScriptで実装する必要がありますが、手軽にコーディングできるため、人気急上昇中です。 私は、JavaのJettyというサーバ兼ライブラリを好んで使っています。NIOに対応しており、高い負荷にもよく耐えてくれます。私はフォールバックを余り好んで使わないためそのまま使っていますが、Jetty上で使えるcometdという仕組みなら確かフォールバックに対応していたはずです(要確認)。 フォールバックされるとComet等になってしまうため、負荷には気をつけて下さい。 node.jsやJetty以外にも多くのサーバがWebSocketに対応してきているため、ご自身の環境に合わせて選択して下さい。