プログラムの素

スマートフォンアプリ開発に携わっているペーペープログラマのブログです

【iOS】UIWebViewのreloadメソッドのタイムアウトについて

iOSでUIWebViewベースのアプリを開発している時に原因不明の不具合が発生しました。

クライアントから「なんかたまに画面上のアイコンタップした時にイベントが起こらないんだけどどーなってんの!?」と。

確認してみると、確かにたまーに不具合が発生してしまいました。。。
UIWebViewで表示するHTMLとかJavascriptとかは他社さんが開発しているので、どーせWeb側の不具合でしょ、と思っていて原因を調査してみたら実はそうでもなさそうでした。。。

原因となりそうな項目は以下の2点。

前者についてはまだ未検証なのですが、reloadメソッドって引数ないですしタイムアウトも何も設定できないですよね?
不具合が発生したとき、ステータスバーのインジケーターがずっと回っていたのでWebViewをリロードしている最中だった可能性があります。(アプリ側でWebViewのローディング中はステータスバーのインジケーターを回すように実装しているので)
ちなみにそのとき、UIWebViewのreloadメソッドを呼び出してから10分くらい待ってもロードが完了しませんでした。

後者については以下のサイトを参考にしました。

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

上記のサイトから引用すると

ブラウザとサーバのあいだに複数の接続を開けずに、一度に一つの接続しか開けない。だから、最初のリクエストが完全に、あるいはタイムアウトで終わるまで、次のたとえば画像のリクエストは待たされる。

ということらしいです。

以上を踏まえた上で、確かにアイコンをタップした時に発生するイベントはWebアプリ側で通信を行っている可能性が高いです。

WebViewのロード中にアイコンをタップしてWeb側で通信処理を行っているけど、Web側の通信処理が行われずイベントが発生しなかった、と推測しました。

対応策としては、UIWebViewのreloadメソッドを呼び出さず、現在のURLでloadRequestする方法(これならタイムアウトの設定も可能)がスマートかなと思いますが、まずはreloadメソッドがホントにタイムアウトにならないか検証する必要がありますね。。。

検証したら結果はこの記事に記載したいと思います。