提问人:BearP 提问时间:2/19/2019 最后编辑:karelBearP 更新时间:2/19/2019 访问量:2240
UIWebView 在尝试打开其他应用程序的 URL 时显示“无法显示 URL”,但它在 Safari 中有效
UIWebView says "URL can't be shown" when trying to open an URL for another app, but it works in Safari
问:
我正在尝试修复一个旧的 iOS 应用程序,其中 UIWebView 不会打开另一个应用程序的 URL。该应用程序显示“无法显示 URL”,这可能表明 URL 错误,但我能够直接在 Safari 中打开它。
我负责为我的公司修复一个应用程序,我对 Objective C 没有太多经验,所以我希望你能帮助我。 该应用程序以前可以工作,但在 2016 年突然停止工作。这可能是因为此时发生了更新,该更新更改了 somURL 无法显示功能。
该应用程序打开一个 UIWebView,并通过它访问一个 Web 服务,用户可以从中输入一些信息等。然后,此 Web 服务调用另一个应用程序来打印标签,但只显示一个带有 .URL can't be shown
当我将此 URL 直接写入 Safari 时,它会打开应用程序并正常工作。这让我认为问题可能出在 UIWebView 的某个地方,但我无法准确定位它可能在哪里。
我不知道哪些应对片段或信息可能值得包含,但如果你问你需要什么,我可以提供。
答:
据推测,如果它曾经工作过,就会调用 UIApplication 的 canOpenUrl: 和 openUrl:(您可能会在 Web 视图委托的 webView:shouldStartLoadWithRequest:navigationType:) 中找到这些调用)
iOS9 对 UIApplication canOpenUrl: 的工作方式进行了更改 - 大多数情况下它不再存在。
如果您只支持 iOS10 - 请查看使用 openURL:options:completionHandler:改为
https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc
评论
所以,除了我的评论之外,试着这样做:
转到处理 webview 的控制器,并将以下代码添加到该方法中:
- (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;
}
然后,还要处理一些可以忽略的错误:
- (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…
}
让我知道它是否适合您。 您可以在此处阅读该解决方案的完整帖子。
祝您编码愉快!
评论