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

提问人:BearP 提问时间:2/19/2019 最后编辑:karelBearP 更新时间:2/19/2019 访问量:2240

问:

我正在尝试修复一个旧的 iOS 应用程序,其中 UIWebView 不会打开另一个应用程序的 URL。该应用程序显示“无法显示 URL”,这可能表明 URL 错误,但我能够直接在 Safari 中打开它。

我负责为我的公司修复一个应用程序,我对 Objective C 没有太多经验,所以我希望你能帮助我。 该应用程序以前可以工作,但在 2016 年突然停止工作。这可能是因为此时发生了更新,该更新更改了 somURL 无法显示功能。

该应用程序打开一个 UIWebView,并通过它访问一个 Web 服务,用户可以从中输入一些信息等。然后,此 Web 服务调用另一个应用程序来打印标签,但只显示一个带有 .URL can't be shown

当我将此 URL 直接写入 Safari 时,它会打开应用程序并正常工作。这让我认为问题可能出在 UIWebView 的某个地方,但我无法准确定位它可能在哪里。

我不知道哪些应对片段或信息可能值得包含,但如果你问你需要什么,我可以提供。

Objective-C iphone xcode uiwebview mobile-safari

评论

0赞 ares777 2/19/2019
URL 方案(搜索 UIApplication.shared.open)和 Info.plist(或主 plist 文件命名的任何名称)或 App Transport Security 呢?这些是要搜索的提示。
0赞 BearP 2/19/2019
我已经对 info.plist 进行了一些更改,但我对 UIApplication.shared.open URL 方案一无所知。你认为这可能是问题发生的地方吗?
0赞 Lapinou 2/19/2019
也许这个链接上有类似的问题。它可以帮助你:这里

答:

0赞 Mark Jenkins 2/19/2019 #1

据推测,如果它曾经工作过,就会调用 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

评论

0赞 BearP 2/19/2019
谢谢你的回答。我会尝试实施您的建议,如果有效,我会返回。
0赞 BearP 2/21/2019
没有运气:(我尝试实现webView:shouldStartLoadWithRequest:navigationType:方法,该方法在另一个解决方案中也提到过,但没有做任何事情。该设备目前在IOS 10.2.2上,所以我也尝试了openURL:options:completionHandler:,但没有任何效果。
0赞 Lapinou 2/19/2019 #2

所以,除了我的评论之外,试着这样做:

转到处理 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…
}

让我知道它是否适合您。 您可以在此处阅读该解决方案的完整帖子。

祝您编码愉快!

评论

0赞 BearP 2/19/2019
感谢您的输入!我一定会尝试一下,并返回结果:)
0赞 BearP 2/21/2019
可悲的是,这并没有解决问题。我对如何解决这个问题没有想法。我做了更多的研究,这似乎是大多数人的正确解决方案,但不是我。
0赞 Lapinou 2/21/2019
不好意思。。。你能发布你的代码(删除所有不需要的东西)吗?因此,我将重新创建我这边的示例来调试它。我知道你的情况,真的很想帮助你。另外,您在哪个设备上测试它?模拟器还是真实设备?您在哪个 iOS 版本和哪个 iOS SDK 上编译它?
0赞 BearP 2/22/2019
这是一个相当大的应用程序,我不确定它是否允许发布代码,但我会问我的经理。我在连接了打印机的真实设备上对其进行了测试。这种连接是通过另一个应用程序发生的,并且我试图在我自己的应用程序中打开这个应用程序。我认为我为 IOS 11 编译了它,并且该设备运行 IOS 10。我不知道这是否会影响任何事情。