ページ

2009年9月1日火曜日

Webページをアクセスしている場合でも webView:resource:willSendRequest:redirectResponse:fromDataSource: のresponseにNSHTTPURLResponse以外が渡ってくることがある

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

WebViewを使ってGoogleMapsを見ていると WebResourceLoadDelegate のメソッドで例外が出ていた。




2009-09-01 12:53:21.225 CookieStorage[23839:10b]
<NSURLResponse: 0x6a680c0>, about:blank
2009-09-01 12:53:21.246 CookieStorage[23839:10b]
*** -[NSURLResponse allHeaderFields]: unrecognized selector
sent to instance 0x6a680c0
2009-09-01 12:53:21.266 CookieStorage[23839:10b]
*** WebKit discarded an uncaught exception in the
webView:resource:didReceiveResponse:fromDataSource:
delegate:
<NSInvalidArgumentException> *** -[NSURLResponse allHeaderFields]:
unrecognized selector sent to instance 0x6a680c0


プログラムではデリゲートメソッド webView:resource:willSendRequest:redirectResponse:fromDataSource:の responseを NSHTTPURLResponse でキャストしてHTTPヘッダ情報などにアクセスしている。
[(NSHTTPURLResponse*)response allHeaderFields]


ところが例外が出ているケースでは URLがどうも "about:blank" のようなものになっており、この場合は型が NSURLResponse になっているのが分かった。存在しないメソッドを呼び出していたので例外が起きていた。もしかすると以前のクラッシュはこれが原因かもしれない。


対応は responseの型をチェックし、NSHTTPURLResponse の場合のみHTTPヘッダ情報へアクセスするようにした。
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
:
}


- - - -
考えてみるとWebブラウジングしていても、リンクが http:// 以外のケース(ftp:// や feed:// など)もあるので当然想定すべきだったか。