在iOS应用内对Universal Links跳转做拦截,屏蔽自动跳转app

最近发现在自己项目中打开优酷、腾讯视频、知乎等网站时,点击跳转或打开此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);
    }
}

 



作者:Anchoriter
链接:https://www.jianshu.com/p/6718a2403de6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2022-05-30 10:43  sundaysios  阅读(1797)  评论(0编辑  收藏  举报