61

我最近发现我的 UIWebView 在 ITMS 链接上卡住了。具体来说,从我的应用程序中的 UIWebView 中,如果我导航到这样的站点单击“在 App Store 上可用”链接,UIWebView 会出错,并显示“Error Domain=WebKitErrorDomain Code=101 The URL can't be显示。”

经过一番谷歌搜索,我意识到我需要捕获应用程序链接的请求并让 iOS 处理它们。我开始查看该方案是否以 "itms" in 开头-webView:shouldStartLoadWithRequest:navigationType:,但意识到系统可能可以处理其他类型的应用程序链接。所以我想出了这个,而不是:

- (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {
    // Give iOS a chance to open it.
    NSURL *url = [NSURL URLWithString:[error.userInfo objectForKey:@"NSErrorFailingURLStringKey"]];
    if ([error.domain isEqual:@"WebKitErrorDomain"]
        && error.code == 101
        && [[UIApplication sharedApplication]canOpenURL:url])
    {
        [[UIApplication sharedApplication]openURL:url];
        return;
    }

    // Normal error handling…
}

我对此有两个问题:

  1. 这是理智的吗?我专门检查错误域和错误代码,并从 userInfo 中获取 URL 字符串。那东西可能会留下来吗?
  2. 这确实适用于上面链接的应用商店链接,但是当我切换回我的应用时,似乎有一个随后失败的请求失败,并出现“帧加载中断”。我怎样才能摆脱它?当我让操作系统处理来自 的请求时,它不会发生-webView:shouldStartLoadWithRequest:navigationType:,所以有点烦人。

如何处理此类请求?

4

3 回答 3

93

这就是我想出的。在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;
}

除了血腥的“帧加载中断”错误之外,这非常有效。我曾认为通过从webView:shouldStartLoadWithRequest:navigationType:Web 视图返回 false 将不会加载请求,因此不会有任何错误需要处理。但即使我返回NO上面,我仍然出现“帧加载中断”错误。这是为什么?

无论如何,我假设它可以被忽略-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…
}

现在 iTunes URL 可以正常工作,mailto:s 和应用程序链接也是如此。

于 2010-12-14T18:13:14.480 回答
8

从 Theory 的代码开始,检查“itms”方案的 URL(由于重定向,可以多次调用此方法)。看到“itms”方案后,停止加载 webView 并使用 Safari 打开 URL。我的 WebView 恰好位于 NavigationController 中,因此在打开 Safari 后我会弹出它(闪烁较少)。

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request 
  navigationType:(UIWebViewNavigationType)navigationType 
{
    if ([[[request URL] scheme] isEqualToString:@"itms-apps"]) {
        [webView stopLoading];
        [[UIApplication sharedApplication] openURL:[request URL]];
        [self.navigationController popViewControllerAnimated:YES];
        return NO;
    } else {
        return YES;
    }
}
于 2011-08-08T18:31:40.030 回答
-2

如果您注册您的应用程序以处理它是否有帮助:链接?

例如 http://incho.net/iphone-development/launching-application-via-url-scheme/

您可以从方案开始,http然后获得itms重定向,如果您的应用未注册为处理该方案,则可能会失败。

于 2010-11-28T23:14:06.860 回答