美文网首页iOS
在iOS应用内对Universal Links跳转做拦截,屏蔽自

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

作者: Anchoriter | 来源:发表于2018-04-19 10:40 被阅读939次

    最近发现在自己项目中打开优酷、腾讯视频、知乎等网站时,点击跳转或打开此App时,如果已经预装过软件的话会很顺畅的直接跳转过去,会导致用户直接去使用第三方,影响用户的使用自己产品的时间。而在使用UC浏览器做相应操作的时候会弹出SKStoreProductViewController应用内下载界面,这样会让很多用户放弃跳转第三方app的行为。

    首先要知道一般iOS应用内跳转的行为有两种实现方式:SchemaUniversal 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);
        }
    }
    

    相关文章

      网友评论

        本文标题:在iOS应用内对Universal Links跳转做拦截,屏蔽自

        本文链接:https://www.haomeiwen.com/subject/mnehkftx.html