最近发现在自己项目中打开优酷、腾讯视频、知乎
等网站时,点击跳转或打开此App时,如果已经预装过软件的话会很顺畅的直接跳转过去,会导致用户直接去使用第三方,影响用户的使用自己产品的时间。而在使用UC浏览器
做相应操作的时候会弹出SKStoreProductViewController
应用内下载界面,这样会让很多用户放弃跳转第三方app的行为。
首先要知道一般iOS应用内跳转的行为有两种实现方式:Schema
和 Universal Link
详细资料可以参考http://awhisper.github.io/2017/09/02/universallink/
通过分析可以判断优酷、腾讯视频、知乎
等使用的是Universal Link
的方式来实现的直接跳转,那么UC浏览器
又是如何对Universal Links
跳转做拦截,通过查找资料终于找到了解决方案
贴个stackoverflow的链接
https://stackoverflow.com/questions/38450586/prevent-universal-links-from-opening-in-wkwebview-uiwebview
WebKit源码其实本就准备了不触发UniversalLink的控制代码
_WKNavigationActionPolicyAllowWithoutTryingAppLink
只不过这个枚举值是私有的并没有对外暴露,但你会发现这个值等于WKNavigationActionPolicyAllow
这个系统公开枚举值+2
,于是乎封掉Universal Link
的方法呼之欲出了。如果你在使用WKWebView
,尝试在decidePolicy
的时候返回这个枚举值!
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
//返回+2的枚举值
decisionHandler(WKNavigationActionPolicyAllow + 2);
}
更新
上述方法只能在9.0之后才能使用,低于9.0版本系统的时候这样的做法将不能跳转,所以优化如下:
//当前设备系统版本号
#define SYSTEMVersion [[[UIDevice currentDevice] systemVersion] floatValue]
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if(SYSTEMVersion < 9.0f){
decisionHandler(WKNavigationActionPolicyAllow);
}else{
//返回+2的枚举值
decisionHandler(WKNavigationActionPolicyAllow + 2);
}
}