iOS 6のSafariではAjaxの動作が異常–すでにデベロッパたちは周知

次の記事

Twitter、年内に全過去発言のダウンロードを実行可能に

safari-ios6-loading

iOS 6のモバイルSafariに、おかしな動作がある。最初は自分の誤操作かと思ったが、どうやらデベロッパたちはすでに知っている本物のバグのようだ。症状は、画面上部にあるロード現況の回転表示、ページのあらゆる部分のロードが終わると回転が止まる小さなアイコンだ。しかしWebサイトによっては、このおちびさんがいつまでも止まらない。ページのロードが、いつまでも終わらないみたいに。

私のような、細かいことを気にするタイプのユーザを悩ませているだけでなく、デベロッパも困っている。これはWebサイトの機能に影響を与えるバグで、一部のWebアプリケーションが正しく動作しなくなるのだ。

問題はLong pollingと関係があるらしい。だからAjaxを使っているWebアプリケーションの多くに症状が現れる。最初気づいたのはGoogle Readersのモバイルサイトだったが、その後GmailやGoogle+のモバイルサイトでも現れた。もちろんGoogle Mapsでも(そう、私はGoogleをよく使うほう)。クロスプラットホームな開発ツールを作っているReal SoftwareのブログでGreg O’Loneが、この問題を説明している。回転する小さなアイコンの話ではなく、もっと一般的に。

というか、デベロッパたちはアイコンの回転が止まらないことよりも、画像がなくなるとか、インタフェイスが応答しない、ランダムな切断が起きる、などの問題を気にしている。

私ももっと一般化して言うと、ブラウザがWebサイトをロードするときは、同時に複数のコンテンツを取り出そうとすることが多い。たとえば、メインページのコンテンツと画像を同時にロードしたり。Ajaxという技法でよく使われるLong pollingという技術は、そんなとき、Webサーバとブラウザを長時間つなぎっぱなしにして、複数のコンテンツを一気にブラウザへ送る。従来の通常のWeb技術では、個々のコンテンツごとにブラウザがサーバにリクエストを送る(サーバへの接続を毎回リフレッシュする)のだが、Ajax/Long pollingではそれをしない。

O’Loneによると、iOS 6ではこの部分の処理が全体的に正しくない。ブラウザとサーバのあいだに複数の接続を開けずに、一度に一つの接続しか開けない。だから、最初のリクエストが完全に、あるいはタイムアウトで終わるまで、次のたとえば画像のリクエストは待たされる。彼は今、AppleのSafariのチームと、この問題でコミュニケーションしているそうだ。

しかしHacker Newsの上には、別の説明がある。それによると、ブラウザ/サーバ間に並列接続ができないという問題ではなく、ページが完全にロードされる前にLong pollingの接続がスタートしてしまうのだ、という。彼は対策を提示している。

おかしいのは、iOS 6のベータのときにAppleの人もデベロッパも、この問題に気づかなかったことだ。自分のアプリのiOSネイティブ版以外にWebバージョンを提供しているところは、けっこう多いはずなのに。iOSの上ではWebをほとんど使わない、というユーザはあまりいないと思うから、Appleもきっと直してくれるはずだ。冗談として言うと、これはネイティブアプリをダウンロードさせたいAppleの、陰謀かな?!

私は、本物のバグだと分かってほっとしている。でも困ることは困るから、早く直して欲しいわね。

[関連ツイート]

[原文へ]
(翻訳:iwatani(a.k.a. hiwa))