UIWebViewと独自スキームを利用する場合の注意

仕事でとあるiPhoneアプリを作っていたときにハマった。

UIWebViewで表示するWEBページに、独自スキームを指定したリンクを設置していた。リリース直前の動作確認で、そのリンクが反応しないことが判明。
didFailLoadWithErrorでエラーの詳細を見てみると、エラーコード101が出力されている。

プロジェクトの指定を確認したりしたが問題なく、またSafariで開く場合は問題なかったので、アプリの実装に問題があるのではないかとコードを確認した。

原因は、UIWebViewのshouldStartLoadWithRequestを実装していたため。どうも独自スキームを定義する場合は、ここでYESを返してはいけないらしい。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
 navigationType:(UIWebViewNavigationType)navigationType {
    if ([request.URL.absoluteString hasPrefix:@"***://"]) {
        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    }
    return YES;
}

ただ、NOを返すだけではダメらしく、Safariで開くようにしてようやく解決。