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

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の、陰謀かな?!
私は、本物のバグだと分かってほっとしている。でも困ることは困るから、早く直して欲しいわね。
[関連ツイート]
@sarahintampa Yup. iPhone 4.
— Simon Bisson (@sbisson) September 20, 2012


