Attention! Translated article might be found on my English blog.

2015年2月3日火曜日

WebView(not UIWebView)でHTTPステータスコードを取得する

MacOSのWebViewではWebDataSourceのresponseプロパティからstatusCodeを参照できます。
例えばWebFrameLoadDelegateのwebView:didFinishLoadForFrame:で
#pragma mark WebFrameLoadDelegate

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
    if ([[sender mainFrame] isEqualTo:frame]) {
        NSLog(@"%@", @([(NSHTTPURLResponse *)[frame.dataSource response] statusCode]));
    }

    // do something
}

てな感じでメインフレームの取得結果を表示することができます。メインフレームだけでなく、frame.dataSource.subresourcesで全リソースの取得結果を参照することも可能です。
同様に、WebFrameLoadDelegate以外にもWebResourceLoadDelegateのwebView:resource:didReceiveResponse:fromDataSource:やwebView:resource:didFinishLoadingFromDataSource:のタイミングでも個々のリソースに対するレスポンスを参照することができます。

なお、UIWebViewではNSCachedURLResponseを使ったり、NSURLProtocolのサブクラスを使う方法があるようです。

参考:  Response headers / statusCode from a UIWebView (using workaround till the webview gets extended!)
参考: Objective-C - iOSのUIWebViewでHTTPステータスをチェックする - Qiita

もしWebViewとUIWebViewの両方で同じことをするなら後者の方法を採用するのが良いかもしれません。