最近有個(gè)需求, 是通過鏈接跳轉(zhuǎn)到應(yīng)用內(nèi)部,現(xiàn)在iOS主流的方案有兩個(gè)
schemaUniversal Links
現(xiàn)在分析下兩個(gè)方案
一、兩種方式的簡(jiǎn)介
schema
schema是iOS9之前比較主流的一種跳轉(zhuǎn)方案了, 更多的是用在了兩個(gè)APP相互跳轉(zhuǎn)中。也可以在Safari中輸入schema://跳轉(zhuǎn)到App內(nèi)部
其實(shí)這種方式很不順滑,在每次跳轉(zhuǎn)的時(shí)候都會(huì)彈框詢問。如果iPhone中如果沒有安裝則會(huì)直接彈出錯(cuò)誤提示
正常產(chǎn)品的思路是如果手機(jī)中沒有安裝APP的話,應(yīng)跳轉(zhuǎn)到App Store下載頁(yè)面。我與前端小伙伴溝通后,因?yàn)閟chema跳轉(zhuǎn)失敗是沒有錯(cuò)誤碼返回的。前端使用計(jì)時(shí)器計(jì)時(shí),如果在規(guī)定時(shí)間內(nèi)沒有跳轉(zhuǎn)到APP,則認(rèn)為是失敗的。這種設(shè)計(jì)確實(shí)有一些體驗(yàn)不好。
而且在微信中輸入schema鏈接,也無法跳轉(zhuǎn)到APP。因?yàn)閟chema并沒有走h(yuǎn)ttp/https鏈接,微信也無法識(shí)別。
使用Safari打開知乎首頁(yè),可直接跳轉(zhuǎn)到知乎項(xiàng)目中,并沒有彈框詢問,我想是時(shí)候擁抱新技術(shù)了。
Universal Links
1.簡(jiǎn)介
建議大家先看看蘋果官方文檔Support Universal Links
Universal Links(通用鏈接)是iOS9.0出的新技術(shù)。如果我們的應(yīng)用支持通用鏈接,那么就可以通過https鏈接來打開APP(手機(jī)中已經(jīng)安裝此APP),或者跳轉(zhuǎn)到https鏈接(手機(jī)中沒有安裝此APP)。
簡(jiǎn)單說一下通用鏈接的特性
- 唯一性:不像自定義的
schema鏈接,通用鏈接不會(huì)被其它的APP所使用。因?yàn)樗褂脴?biāo)準(zhǔn)的https鏈接到你自己的域名?!疽?yàn)槟愕挠蛎粫?huì)被其他人所使用】- 安全性:當(dāng)用戶下載
APP的時(shí)候,iOS會(huì)檢查你上傳到web服務(wù)器的文件以確保您的網(wǎng)站允許您的應(yīng)用程序以其名義打開網(wǎng)址。因?yàn)橹挥斜救擞袡?quán)利創(chuàng)建且上傳該文件到服務(wù)器,所以網(wǎng)站和APP的關(guān)聯(lián)是安全的。- 靈活性:甚至在
iOS設(shè)備沒有安裝你項(xiàng)目的時(shí)候通用鏈接也會(huì)正常工作。當(dāng)設(shè)備沒有安裝APP的時(shí)候,點(diǎn)擊通用鏈接會(huì)在Safari展示你網(wǎng)站的內(nèi)容。- 靈活性:一個(gè)通用鏈接可以同時(shí)作用于項(xiàng)目和網(wǎng)站中。
- 靈活性:其它
APP可以在不知道你的APP是否安裝的情況下與你的APP通信
2.使用條件
1.有一個(gè)注冊(cè)的域名。
2.支持https請(qǐng)求,并且CA證書是有效的,這個(gè)需要與后端同事進(jìn)行確認(rèn)。
3.可上傳一個(gè)json文件到web服務(wù)器
4.APP版本至少為iOS9及以上
5.Xcode版本為7以上
二、通用鏈接使用說明
首先我們先設(shè)置幾個(gè)全局來方便大家理解??
static NSString *webLink = @"test.com" //域名
static NSString *bundleID = @"com.test.bundle" //bundleID
static NSString *teamID = @"TEAMIDSHSAUX" //team ID [可登錄Apple Developer查看]
1.Xcode配置
(1)首先是將Associated Domains打開,并填寫我們的域名,前綴是applinks。etc.如果你的域名是test.com,則填上applinks:test.com。APP會(huì)在第一次啟動(dòng)的時(shí)候通過填寫的域名來下載apple-app-site-association文件,該文件會(huì)在下面說明。


同時(shí)開發(fā)者中心的Associated Domains也會(huì)變成啟用狀態(tài)

2.創(chuàng)建apple-app-site-association文件
首先創(chuàng)建一個(gè)apple-app-site-association文件(注意是沒有后綴的),其內(nèi)容是json格式,官方示例如下
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMIDSHSAUX.com.test.bundle",
"paths": [ "*" ]
}
]
}
}
相關(guān)參數(shù)說明
- appID:由TeamID.BundleID組成。TeamID可在開發(fā)者中心查看,BundleID可在Xcode中查看。
- paths:設(shè)定一個(gè)App的路徑支持列表,只有這些指定的路徑鏈接才會(huì)被App所處理。(paths是大小寫敏感,*是通配符表示任意路徑,一般填寫這個(gè)就可以)
3.上傳apple-app-site-association文件
將上面生成好的apple-app-site-association上傳到web server
這里一定要跟你的后端&前端小伙伴溝通, 自己是做不出來的哦
apple-app-site-association文件保存的位置
- 根目錄下。etc.
https://test.com/apple-app-site-association- .well-known文件夾下(推薦,蘋果在iOS9.3更改了通用鏈接的請(qǐng)求文件的位置,但是仍然支持上面的路徑)。在根目錄新建.well-known文件夾(不要忘記前面的.)。etc.
https://test.com/.well-known/apple-app-site-association
4.檢查
(1)使用瀏覽器打開我們上傳的文件路徑,應(yīng)該可以直接看到剛剛上傳的json文件,或者是會(huì)自動(dòng)下載到電腦。

(2)蘋果也提供了一個(gè)官方網(wǎng)頁(yè)供我們開發(fā)者來驗(yàn)證https://test.com/apple-app-site-association是否有效。驗(yàn)證地址:https://search.developer.apple.com/appsearch-validation-tool/
成功的情況應(yīng)該如下圖

三、檢驗(yàn)成果
重新編譯App后,就可以檢驗(yàn)成果了。
(2).在safari中直接打開你的域名,網(wǎng)頁(yè)下來會(huì)看見上方的提示條。
(3).在微信中打開域名,可以直接跳轉(zhuǎn)到官網(wǎng),但是在微信內(nèi)置的瀏覽器上方不會(huì)顯示提示條。但是選擇在Safari中打開是可以顯示提示條的。
四、在App中進(jìn)行處理
用戶通過鏈接進(jìn)入我們的App中,在AppDelegate是可以獲取該鏈接的
我在項(xiàng)目中使用的是蘑菇街的路由層.
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * _Nullable))restorationHandler
{
NSLog(@"%@", userActivity.webpageURL);
[MGJRouter openURL:[userActivity.webpageURL absoluteString]];
return YES;
}