2012-02-28

UIWebViewのエラーハンドリングを見直す

iPhoneアプリで、UIWebViewのwebView:didFailLoadWithError: を、いままで次のように書いていました。
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    if (error.code != -999) {
        // ユーザによる意図的な中止でない場合はエラーダイアログ表示
  NSString *errMsg = [error.userInfo objectForKey:@"NSLocalizedDescription"];
        UIAlertView *dlg = [[[UIAlertView alloc] initWithTitle:@"Error" message:errMsg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil] autorelease];
        [dlg show];
 }
}

しかし、これはあまり良くないですね。ユーザーが中止ボタンを押した場合以外にも正常な読み込み中断はあるのに、それらに対してもErrorダイアログが表示されてしまいます。
正常な処理なのにwebView:didFailLoadWithError:が呼ばれる例としては、音声データなどをプラグインで処理した場合(エラーコード 204)や、AppStoreへのリンクをopenURL: した場合(エラーコード 102)があります。思いつかないだけで他にもあるかもしれません。
エラーコード 204と102の場合はダイアログを表示する必要がなくて、それ以外の場合も本当にエラーなのか怪しいので、エラーメッセージを取得できなかったときにだけダイアログのタイトルに「エラー」と表示するという感じにしたいと思います。

0 件のコメント: