How to handle app URLs in a UIWebView?

前端 未结 3 1691
既然无缘
既然无缘 2020-12-04 07:08

I recently found that my UIWebView was choking on ITMS links. Specifically, from the UIWebView in my app, if I navigate to a site such as this one and click the \"Available

相关标签:
3条回答
  • 2020-12-04 07:38

    Here's what I came up with. In webView:shouldStartLoadWithRequest:navigationType:, I ask the OS to handle any non-http and non-https requests that it can, like so:

    - (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;
    }
    

    This works very well except for the bloody "Frame Load Interrupted" error. I had thought that by returning false from webView:shouldStartLoadWithRequest:navigationType: that the web view would not load the request and therefore there would be no errors to handle. But even though I return NO above, I still "Frame Load Interrupted" error. Why is that?

    Anyway, I'm assuming it can be ignored in -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…
    }
    

    And now iTunes URLs work properly, as do mailto:s and app links.

    0 讨论(0)
  • 2020-12-04 07:43

    Starting with Theory's code, examine the URL for "itms" scheme(s) (this method can be called multiple times due to redirects). Once you see an "itms" scheme, stop the webView from loading and open the URL with Safari. My WebView happens to be in a NavigationController, so I pop out of that after opening Safari (less flashing).

    - (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;
        }
    }
    
    0 讨论(0)
  • 2020-12-04 07:44

    Does it help if you register your app for handling itms: links?

    e.g. http://inchoo.net/iphone-development/launching-application-via-url-scheme/

    You may start with scheme http but then get an itms redirect, which could fail if your app is not registered as handling that scheme.

    0 讨论(0)
提交回复
热议问题