iOS 9下Universal Link(通用鏈接)開(kāi)發(fā)

背景

在iOS 9以前获印,我們從外部啟動(dòng)App都是通過(guò)URL Scheme實(shí)現(xiàn)跳轉(zhuǎn)的述雾。這種方式雖然可自定程度很高,能夠巧妙地實(shí)現(xiàn)很多跳轉(zhuǎn)兼丰,但弊端也很明顯:我們只能通過(guò)scheme://example這種格式的鏈接來(lái)實(shí)現(xiàn)跳轉(zhuǎn)玻孟,而且現(xiàn)在蘋(píng)果還對(duì)這種方式的跳轉(zhuǎn)加了一個(gè)提示框:“是否打開(kāi)XXX”。對(duì)于對(duì)Web和原生App交互的場(chǎng)景需求量很大的產(chǎn)品來(lái)說(shuō)鳍征,這樣的跳轉(zhuǎn)方式顯然是步驟冗雜的黍翎,用戶體驗(yàn)并不好。

iOS 9以后艳丛,Universal Link的出現(xiàn)解決了這個(gè)問(wèn)題匣掸。它所提供的直接趟紊、順暢、無(wú)縫銜接的跳轉(zhuǎn)能夠讓用戶體驗(yàn)提升一個(gè)級(jí)別碰酝。用戶可以點(diǎn)擊開(kāi)發(fā)者指定的類似于https://example.com/t的URL直接喚醒App霎匈,而不需要在瀏覽器打開(kāi)再點(diǎn)擊其他按鈕。

在你的App中添加這個(gè)功能很簡(jiǎn)單:

  • 上傳apple-app-site-association到服務(wù)器根目錄下
  • 在AppDelegate中實(shí)現(xiàn)相應(yīng)的方法

配置

首先送爸,我們要在蘋(píng)果開(kāi)發(fā)者網(wǎng)站中開(kāi)啟App的Associated Domains功能铛嘱。

Account -> Certificates, Identifiers & Profiles -> App IDs -> YourApp -> Edit中把Associated Domains設(shè)置為Enable

然后我們需要配置一下工程文件,找到Capabilities -> Associated Domains

打開(kāi)此功能并把你需要跳轉(zhuǎn)的domain加進(jìn)去袭厂,格式為applinks:www.example.com

Paste_Image.png

部署

注意

首先你的服務(wù)器必須得支持SSL

接下來(lái)弄痹,我們需要上傳一個(gè)json文件到我們的服務(wù)器。json文件以apple-app-site-association命名

注意

文件不需要添加任何后綴

json的格式是這樣的:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TeamID.com.domain.App",
        "paths":[ "*" ]
      }
    ]
  }
}
  • appID:TeamID加上Bundle ID

  • paths:支持Universal Link嵌器,也就是可以跳轉(zhuǎn)的路徑肛真。*代表此域名下所有路徑都支持,也可以具體制定到某個(gè)頁(yè)面例如/path/page或者某個(gè)路徑下所有URL例如/path/*

關(guān)于paths的配置爽航,可以參考蘋(píng)果官方文檔

  • Use * to specify your entire website
  • Include a specific URL, such as /wwdc/news/, to specify a particular link
  • Append * to a specific URL, such as /videos/wwdc/2015/*, to specify a section of your website
  • In addition to using * to match any substring, you can also use ? to match any single character. You can combine both wildcards in a single path, such as /foo/*/bar/201?/mypage.

最后蚓让,我們只需要把配置好的json文件上傳到服務(wù)器中該域名的根目錄下,言下之意讥珍,我們可以用GET請(qǐng)求可以獲取到https://www.example.com/apple-app-association

再次強(qiáng)調(diào)必須是HTTPS協(xié)議

當(dāng)我們的App在設(shè)備上第一次運(yùn)行時(shí)历极,如果支持Associated Domains功能,那么iOS會(huì)自動(dòng)去GET定義的Domain下的apple-app-site-association文件衷佃。

需要留意iOS會(huì)先請(qǐng)求https://domain.com/.well-known/apple-app-site-association如果此文件請(qǐng)求不到趟卸,再去請(qǐng)求https://domain.com/apple-app-site-association

所以如果想要避免服務(wù)器接收過(guò)多GET請(qǐng)求,可以直接把apple-app-site-association放在./well-known/目錄下

注意

服務(wù)器上apple-app-site-association的更新不會(huì)讓iOS本地的apple-app-site-association同步更新氏义,即iOS只會(huì)在App第一次啟動(dòng)時(shí)請(qǐng)求一次锄列,以后除非App更新或重新安裝否則不會(huì)在每次打開(kāi)時(shí)請(qǐng)求apple-app-site-association

開(kāi)發(fā)

待我們服務(wù)器部署好了,用curl測(cè)試一下apple-app-site-association能夠正確GET到了,那么我們就需要在工程中響應(yīng)跳轉(zhuǎn)事件了惯悠。

我們?cè)贏ppDelegate中實(shí)現(xiàn)如下代理方法:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{

具體實(shí)現(xiàn):

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
    
    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return YES;
    }
    
    //讀取url地址
    NSURL *webUrl = userActivity.webpageURL;
    
    
    if (![webUrl.path isEqualToString:@"/show"]) {
        //path錯(cuò)誤邻邮,直接從safari打開(kāi)
        [[UIApplication sharedApplication] openURL:webUrl];
        return YES;
    }
    //跳轉(zhuǎn)并顯示內(nèi)容
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notify" object:@"hello world"];

    
    return YES;
}

這里的自由度就很高了,我們可以根據(jù)傳入的任何符合跳轉(zhuǎn)條件的URL進(jìn)行不同的操作克婶。

測(cè)試

現(xiàn)在一切都已經(jīng)完成了筒严,現(xiàn)在我們可以在短信中點(diǎn)擊一個(gè)URL直接跳轉(zhuǎn)到我們的App。至于如何檢驗(yàn)URL是否能夠跳轉(zhuǎn)情萤,一個(gè)快捷方便的方法就是在系統(tǒng)原生App中(如短信鸭蛙、郵件等)長(zhǎng)按URL,如果彈出的選項(xiàng)中有在“your app”中打開(kāi)筋岛,那么證明該URL是支持跳轉(zhuǎn)的娶视。

注意

非系統(tǒng)原生App不一定能支持直接點(diǎn)擊URL跳轉(zhuǎn),例如在微信中點(diǎn)擊URL會(huì)首先在微信內(nèi)的WebView打開(kāi)泉蝌,如果要跳轉(zhuǎn)只能再通過(guò)Safari打開(kāi)歇万。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市勋陪,隨后出現(xiàn)的幾起案子贪磺,更是在濱河造成了極大的恐慌,老刑警劉巖诅愚,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寒锚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡违孝,警方通過(guò)查閱死者的電腦和手機(jī)刹前,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雌桑,“玉大人喇喉,你說(shuō)我怎么就攤上這事⌒?樱” “怎么了拣技?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耍目。 經(jīng)常有香客問(wèn)我膏斤,道長(zhǎng),這世上最難降的妖魔是什么邪驮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任莫辨,我火速辦了婚禮,結(jié)果婚禮上毅访,老公的妹妹穿的比我還像新娘沮榜。我一直安慰自己,他們只是感情好喻粹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布敞映。 她就那樣靜靜地躺著,像睡著了一般磷斧。 火紅的嫁衣襯著肌膚如雪振愿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天弛饭,我揣著相機(jī)與錄音冕末,去河邊找鬼。 笑死侣颂,一個(gè)胖子當(dāng)著我的面吹牛档桃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播憔晒,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼藻肄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔑舞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嘹屯,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤攻询,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后州弟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钧栖,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年婆翔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拯杠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啃奴,死狀恐怖潭陪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情最蕾,我是刑警寧澤畔咧,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站揖膜,受9級(jí)特大地震影響誓沸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壹粟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一拜隧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趁仙,春花似錦洪添、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至盏袄,卻和暖如春忿峻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辕羽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工逛尚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刁愿。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓绰寞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滤钱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容