Вот что я придумал. В webView:shouldStartLoadWithRequest:navigationType:
я прошу ОС обрабатывать любые запросы не-http и не-https, как это возможно, например:
- (BOOL)webView:(UIWebView *)wv shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
// Determine if we want the system to handle it.
NSURL *url = request.URL;
if (![url.scheme isEqual:@"http"] && ![url.scheme isEqual:@"https"]) {
if ([[UIApplication sharedApplication]canOpenURL:url]) {
[[UIApplication sharedApplication]openURL:url];
return NO;
}
}
return YES;
}
Это работает очень хорошо, за исключением кровавой ошибки «Frame Load Interrupted». Я думал, что, возвращая false из webView:shouldStartLoadWithRequest:navigationType:
, веб-представление не будет загружать запрос и, следовательно, не будет ошибок для обработки. Но даже если я возвращаю NO
выше, я все равно выдаю ошибку «Frame Load Interrupted». Почему это так?
В любом случае, я предполагаю, что это можно игнорировать в -webView:didFailLoadWithError:
:
- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {
// Ignore NSURLErrorDomain error -999.
if (error.code == NSURLErrorCancelled) return;
// Ignore "Fame Load Interrupted" errors. Seen after app store links.
if (error.code == 102 && [error.domain isEqual:@"WebKitErrorDomain"]) return;
// Normal error handling…
}
И теперь URL-адреса iTunes работают правильно, как и mailto:
s и ссылки на приложения.