当我在 google 上搜索并点击 Etsy.com 查找 exmaple 时,WKWebView 会将我重定向到 iPhone 上安装的 Etsy 应用程序。 我怎样才能禁用这种行为?我希望 WKWebView 将我重定向到 etsy.com 移动网站。 我用的是迅捷。
不幸的是,
WKWebView
不会将带有自定义方案的URL发送回您的应用程序以自动处理。
如果您在没有特殊处理的情况下尝试此操作,那么在用户通过第三方服务进行身份验证后,您的 Web 视图看起来会挂起,并且您将永远不会收到回调。您可以尝试使用带有标准 http 或 https 方案的重定向 URI,但是
WKWebView
只会尝试加载它,而不是将其从 Web 视图定向到本机应用程序来处理。
为了处理重定向,您需要在
decidePolicyForNavigationAction
的 WebPolicyDelegate
中实现 WKWebView
来检测自定义 URL 方案并将其定向到要处理的应用程序:
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {
print("webView:\(webView) decidePolicyForNavigationAction:\(navigationAction) decisionHandler:\(decisionHandler)")
let app = UIApplication.sharedApplication()
let url = navigationAction.request.URL
let myScheme: NSString = "https"
if (url!.scheme == myScheme) && app.canOpenURL(url!) {
print("redirect detected..")
// intercepting redirect, do whatever you want
app.openURL(url!) // open the original url
decisionHandler(.Cancel)
return
}
decisionHandler(.Allow)
}
您可以在这里找到详细信息
我已经安装了 Etsy 应用程序,并确认在 Safari 中搜索“etsy”并点击第一个结果 (etsy.com) 将启动 Etsy 应用程序。
我在 Xcode 中创建了一个测试“单视图应用程序”,并将以下行添加到
ViewController
的 viewDidLoad 中:
override func viewDidLoad() {
super.viewDidLoad()
let webView = WKWebView(frame:view.bounds, configuration: WKWebViewConfiguration())
view.addSubview(webView)
webView.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.com")!))
}
搜索 etsy 并单击第一个结果后,我会在测试应用程序中转到 etsy.com(不会跳转到 Etsy 应用程序)。
您在代码中是否做了其他可能导致 WKWebView 允许重定向的操作?
不幸的是,由于通用链接,您不能再依赖
url.scheme
来检测链接何时在另一个应用程序中打开。然而,亚历山德罗·奥尔纳诺 (Alessandro Ornano) 首次在此描述的技术似乎仍然有效。 (我在 iOS 17 的 Xcode 14.3.1 中编写此内容。)
这是我在类中使用的代码片段,它实现了
WKNavigationDelegate
:
func webView(
_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: ((WKNavigationActionPolicy) -> Void)
) {
if navigationAction.navigationType == .linkActivated,
let url = navigationAction.request.url,
case let urlString = url.absoluteString,
urlShouldNotRedirect(urlString: urlString) {
service.logger.info("found URL to not redirect: '\(urlString)', attempting to open in-app.")
decisionHandler(.cancel)
webView.load(navigationAction.request)
return
}
decisionHandler(.allow)
}
请注意,如果我们不检查
navigationAction.navigationType
,当网址不是刚刚单击的网址时,这将导致无限重定向。 (谷歌的搜索结果经常出现这种情况,至少在我的测试中是这样。)
显然,
urlShouldNotRedirect()
返回一个布尔值,表示我是否允许从给定的url.absoluteString
进行重定向。
在正常情况下,WKWebView 不应打开第 3 方应用程序而不是访问网站 - 但我知道有 2 个例外
WKNavigationDelegate
处理程序中显式插入一些代码来打开第 3 方应用程序