最近發現在自己項目中打開優酷、騰訊視頻、知乎
等網站時,點擊跳轉或打開此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);
}
}