iOS Universal Links教程

最近有個(gè)需求, 是通過鏈接跳轉(zhuǎn)到應(yīng)用內(nèi)部,現(xiàn)在iOS主流的方案有兩個(gè)

  • schema
  • Universal Links

現(xiàn)在分析下兩個(gè)方案

一、兩種方式的簡(jiǎn)介

schema

schema是iOS9之前比較主流的一種跳轉(zhuǎn)方案了, 更多的是用在了兩個(gè)APP相互跳轉(zhuǎn)中。也可以在Safari中輸入schema://跳轉(zhuǎn)到App內(nèi)部

通過schema方式跳轉(zhuǎn)App

其實(shí)這種方式很不順滑,在每次跳轉(zhuǎn)的時(shí)候都會(huì)彈框詢問。如果iPhone中如果沒有安裝則會(huì)直接彈出錯(cuò)誤提示
通過schema找不到對(duì)應(yīng)的應(yīng)用

正常產(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í)別。
微信聊天中輸入schema是無法跳轉(zhuǎn)的

使用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ì)在下面說明。

打開Associated Domains

(2)配置后會(huì)發(fā)現(xiàn)項(xiàng)目中多了一個(gè)APPNAME.entitlements文件
APPNAME.entitlements

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

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)該如下圖

雖然有一個(gè)error,但是不影響使用

三、檢驗(yàn)成果

重新編譯App后,就可以檢驗(yàn)成果了。

(1).在備忘錄輸入你的域名,點(diǎn)擊可直接跳轉(zhuǎn)到App,長(zhǎng)按會(huì)顯示(在“AppName”中打開)。
備忘錄

(2).在safari中直接打開你的域名,網(wǎng)頁(yè)下來會(huì)看見上方的提示條。


Safari中打開

(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;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容