1. 程式人生 > 其它 >在iOS應用內對Universal Links跳轉做攔截,遮蔽自動跳轉app

在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
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。