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:// など)もあるので当然想定すべきだったか。