禁用WKWebView打开链接以重定向到我的iPhone上安装的应用程序
当我在搜索谷歌并点击Etsy.com时,WKWebView会将我重定向到我的iPhone上安装的Etsy应用程序。 如何禁用此行为? 我希望WKWebView将我重定向到etsy.com移动网站。 我正在使用swift。
不幸的是, WKWebView
不会将带有自定义方案的url发送回您的应用程序以自动处理。
如果您在没有特殊处理的情况下尝试此操作,则在用户使用第三方服务进行身份validation后您的Web视图将会挂起,并且您将永远不会收到回调。 您可以尝试使用标准http或https方案的重定向URI,但WKWebView
只会尝试加载它,而不是将其从Web视图导出到您的本机应用程序来处理。
为了处理重定向,您需要在decidePolicyForNavigationAction
的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) }
您可以在此处找到详细信息
我已经安装了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允许重定向的内容?
在正常情况下,WKWebView不应该打开第三方应用程序而不是去网站 – 但我知道2个例外
- 如果您已在
WKNavigationDelegate
处理程序中明确插入一些代码以打开第三方应用程序 - 如果iOS工作不正常(重新启动设备进行修复) – 似乎有一个错误,偶尔会创建您描述的行为(在iOS10.2中观察)