在iOS應用內對Universal Links跳轉做攔截,屏蔽自動跳轉app

最近發現在自己項目中打開優酷、騰訊視頻、知乎等網站時,點擊跳轉或打開此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);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容