Ios 禁用WKWebView以打开链接重定向到安装在我的iPhone上的应用
当我搜索谷歌并点击Etsy.com查找exmaple时,WKWebView会将我重定向到安装在iPhone上的Etsy应用程序。 如何禁用此行为?我希望WKWebView将我重定向到etsy.com移动网站。Ios 禁用WKWebView以打开链接重定向到安装在我的iPhone上的应用,ios,swift,wkwebview,Ios,Swift,Wkwebview,当我搜索谷歌并点击Etsy.com查找exmaple时,WKWebView会将我重定向到安装在iPhone上的Etsy应用程序。 如何禁用此行为?我希望WKWebView将我重定向到etsy.com移动网站。 我正在使用swift。我已经安装了Etsy应用程序,并确认在Safari中搜索“Etsy”并点击第一个结果(Etsy.com)将启动Etsy应用程序 我在Xcode中创建了一个测试“单视图应用程序”,并简单地将以下行添加到ViewController的viewDidLoad中: over
我正在使用swift。我已经安装了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
不会将带有自定义方案的URL发送回您的应用程序以自动处理
如果您在没有特殊处理的情况下尝试此操作,则在用户使用第三方服务进行身份验证后,您的web视图看起来将挂起,并且您将永远不会收到回调。您可以尝试将重定向URI与标准http或https方案一起使用,但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)
}
您可以找到详细信息在正常情况下,WKWebView不应打开第三方应用程序,而应访问网站-但我知道有两个例外
- 如果您已在
处理程序中显式插入一些代码以打开第三方应用程序WKNavigationDelegate
- 如果iOS运行不正常(重新启动设备进行修复)-似乎有一个bug,它偶尔会创建您正在描述的行为(在iOS10.2中观察到)
WKNavigationDelegate
中截取链接,并亲自展示该网站。您可以解释更多信息吗?当然可以。如果实现WKNavigationDelegate
,则每当单击链接时,都应调用方法webView(\uwebview:WKWebView,decisionPolicyFornavigationAction导航操作:WKNavigationAction,decisionHandler decisionHandler:(WKNavigationActionPolicy)->Void)
。例如,检查navigationAction.request.URL
属性以确保它不是Etsy;如果是,请使用decisionHandler取消导航,并使用loadRequest()
亲自访问网站。希望这能阻止深层链接。没有通用的解决方案可以阻止所有深层链接?不幸的是,我还没有找到。这在iOS 9-10上不起作用。。。当我单击自定义方案url时,决不会调用decidePolicyForNavigationAction。@Borzh您找到iOS 10的解决方案了吗?不,我没有。。。我记得web团队以某种方式修复了该漏洞,但实际上不知道如何修复。这是WKNavigationDelegate
的一部分,现在这是因为使用Apple应用程序站点关联文件的通用应用程序链接。参考