the*_*ory 61 iphone cocoa uiwebview ios uiwebviewdelegate
我最近发现我的UIWebView在ITMS链接上窒息.具体而言,在我的应用程序中的UIWebView,如果我浏览到一个网站,如这一个,然后单击"可用在App Store上的"链接,将UIWebView的错误了"错误域= WebKitErrorDomain代码= 101的网址不能显示".
经过一段谷歌搜索,我意识到我需要捕获应用程序链接的请求并让iOS处理它们.我开始时查看该方案是否以"itms"开头-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…
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
-webView:shouldStartLoadWithRequest:navigationType:,它不会发生,所以它有点烦人.如何你处理这些请求?
the*_*ory 92
这就是我想出来的.在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;
}
Run Code Online (Sandbox Code Playgroud)
除了血腥的"帧加载中断"错误之外,这种方法非常有效.我曾经想过,通过返回false webView:shouldStartLoadWithRequest:navigationType:,web视图不会加载请求,因此不会有错误处理.但即使我返回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…
}
Run Code Online (Sandbox Code Playgroud)
现在iTunes的URL工作正常,mailto:s和app链接也是如此.
小智 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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66295 次 |
| 最近记录: |