上一篇已經介紹了iOS系統層面提供的應用之間跳轉的技術和實施方案,本篇會帶你們更深刻的瞭解UniveralLinks技術,探究其綁定運做原理,使用時的技巧。ios
對於UniversalLinks的生效和綁定原理,官方文檔並未說明,經過親自嘗試整理出了其綁定原理,這有助於對於觸發時機把握:web
App從iOS9開始,安裝App成功後,系統會檢查App是否對UniversalLinks技術作了支持,若是檢查到有作支持,則從App的associated-domains配置裏讀取綁定域名。算法
訪問該域名下預設的JSON文件apple-app-site-association
,讀取JSON文件中的app綁定信息,與當前App內的信息作對比。跨域
若是匹配成功,在系統本地內部就作完了雙向綁定。瀏覽器
也就是隻要App安裝完成,就能夠即刻觸發UniversalLinks打開App啦!不須要像推送那樣,須要打開一次。微信
上一篇文章也提到了,目前全部包括UniversalLinks技術都沒法直接對App的安裝作判斷。網絡
但我要說:非也!UniversalLinks提供的一項特性可讓咱們反向推斷App是否安裝,並且準確率至關高,不像scheme跳轉那樣,只能作延時。app
UniversalLinks在觸發時,也就是連接被點擊時,系統會與本地已經創建雙向綁定的數據進行匹配,匹配到的話,這個網絡請求就會在系統層面被攔截,系統就會轉而打開綁定的App,並把完整URL傳給App的openURL的Delegate方法來處理。反之,若是App沒有安裝,那麼點擊連接時系統沒法匹配到信息,則就將請求放行,讓服務端接收到這個請求來處理。dom
看到這裏已經很明瞭了吧,用戶只要點擊了,服務端能夠經過是否接收到請求來判斷App是否已安裝。工具
固然這裏也會不許,但機率比較小,緣由若是用戶是長按打開,或者打開App後點擊了右上角的系統的返回按鈕後,系統會下次觸發UniversalLinks的時候就不會攔截請求了,致使接收到請求的設備其實已經App,而咱們沒法知道。要想從新讓系統攔截,用戶須要點擊的時候長按link,而且選擇經過App打開,以後才又會被攔截。
但已經比scheme跳轉設置一個timeout要來的靠譜的多了。
UniversalLinks做爲一個平滑使用體驗的工具類技術來講,自己不具有拉新客戶的功能:好比新用戶若是從站外點擊UniversalLinks,那麼用戶沒有裝App的話,只是會訪問m站而已,無它;引導老用戶從H5遷移到App的能力也比較弱,一直使用m站的用戶,只有在頁面頂部看到有一個入口,點擊才能打開App。緣由是用戶若是直接輸入了m站的地址,在站內訪問,是不會觸發UniversalLinks的,只是會在綁定的H5頁面頂部有一個bar提醒用戶,點擊能夠跳轉到App的相同功能,能夠說是很弱的。
讓咱們看看怎麼才能讓它具有強制拉新引舊能力:
https://app.alibaba.com/babalink?scheme=enalibaba://detail?id=123&url=https://m.alibaba.com/product?id=123
每一個一級參數下的值都須要urlencode,這邊爲了查看方便就不作了。[[UIApplication sharedApplication] opentURL:@"https://app.alibaba.com/babalink?scheme=enalibaba://detail?id=123&url=https://m.alibaba.com/product?id=123"]
這樣打開,才能跳轉到目標app,若是把連接塞到webview中則不會觸發,請求必定會到服務端。https://app-c.alibaba.com/babalink?scheme=enalibaba://detail?id=123&url=https://m.alibaba.com/product?id=123
注意這個連接的域名不是app.alibaba.com
,這個h5頁面展現一個按鈕,跳轉連接爲https://app.alibaba.com/babalink?scheme=enalibaba://detail?id=123&url=https://m.alibaba.com/product?id=123
。爲何?由於要跨域,並且點擊行爲在瀏覽器中進行是沒法阻斷的。總結一下,巧用UniversalLink須要讓服務端的這個link具有