禁用 WKWebView 以打开链接以重定向到我的 iPhone 上安装的应用程序
Posted
技术标签:
【中文标题】禁用 WKWebView 以打开链接以重定向到我的 iPhone 上安装的应用程序【英文标题】:Disable WKWebView for opening links to redirect to apps installed on my iPhone 【发布时间】:2016-05-07 09:04:26 【问题描述】:当我在谷歌搜索并单击 Etsy.com 时,WKWebView 将我重定向到安装在我的 iPhone 上的 Etsy 应用程序。 如何禁用此行为?我希望 WKWebView 将我重定向到 etsy.com 移动网站。 我正在使用 swift。
【问题讨论】:
您可以尝试截取WKNavigationDelegate
中的链接并自己展示网站。
你能解释一下吗?
当然。如果您实现WKNavigationDelegate
,则每当单击链接时都应调用方法webView(_ webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler decisionHandler: (WKNavigationActionPolicy) -> Void)
。例如,检查 navigationAction.request.URL
属性以确保它不是 Etsy;如果是,请使用decisionHandler 取消导航并使用loadRequest()
自己访问网站。希望这会阻止深度链接。
这个问题没有通用的解决方案会阻止所有的深层链接吗?
很遗憾,我还没有找到。
【参考方案1】:
不幸的是,WKWebView
不会将带有自定义方案的 url 发送回您的应用程序以自动处理。
如果您在不进行特殊处理的情况下尝试此操作,则在用户通过第三方服务进行身份验证后,您的 Web 视图看起来会挂起,并且您将永远不会收到您的回调。您可以尝试使用带有标准 http 或 https 方案的重定向 URI,但 WKWebView
只会尝试加载它,而不是将其从 Web 视图引导到您的本机应用程序来处理。
为了处理重定向,您需要在您的WKWebView
的WebPolicyDelegate
中实现decidePolicyForNavigationAction
,以检测自定义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)
您可以找到详细信息here
【讨论】:
这在 ios 9-10 上不起作用...当我点击自定义方案 url 时,决不会调用 decisionPolicyForNavigationAction。 @Borzh 你找到 iOS 10 的解决方案了吗? 不,我没有......我记得网络团队以某种方式修复了这个错误,但不知道如何,真的。 现在是WKNavigationDelegate
的一部分【参考方案2】:
我已安装 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 允许重定向的操作?
【讨论】:
这是因为通用应用链接使用 Apple 应用网站关联文件。参考developer.apple.com/library/archive/documentation/General/…【参考方案3】:在正常情况下,WKWebView 不应打开第 3 方应用程序而不是访问网站 - 但我知道 2 个例外情况
如果您已在WKNavigationDelegate
处理程序中明确插入一些代码以打开第 3 方应用程序
如果 iOS 工作不正常(重新启动设备以修复) - 似乎有一个错误,偶尔会产生您所描述的行为(在 iOS10.2 中观察到)
【讨论】:
以上是关于禁用 WKWebView 以打开链接以重定向到我的 iPhone 上安装的应用程序的主要内容,如果未能解决你的问题,请参考以下文章