iOS 9學(xué)習(xí)系列:打通 iOS 9 的通用鏈接(Universal Links)

在WWDC 2015 上, Apple 為 iOS 9 宣布了一個(gè)所謂 通用鏈接 的深層鏈接特性, 視頻地址為 [無(wú)縫鏈接到您的 App]宿稀。雖然它不是一個(gè)必須實(shí)現(xiàn)的功能, 但還是需要引起一些注意霎肯。
在網(wǎng)上有太多讓人迷惑和錯(cuò)誤的信息, 這次 WWDC 本身也沒(méi)有去描述細(xì)節(jié)。幸運(yùn)的是, 在 HOKO 我們?cè)谖覀兊闹悄苕溄由咸砑恿诉@一特性, 所以我們可以無(wú)縫的引導(dǎo)用戶到 APP 上疏唾。
什么是通用鏈接冠跷?
很顯然 Apple 正在大力推動(dòng) APP 開(kāi)發(fā)者在深層鏈接上有更好的體驗(yàn)荡含。所有的消息都圍繞著深層鏈接技術(shù)火窒。與此同時(shí), Apple 推出通用鏈接:一種能夠方便的通過(guò)傳統(tǒng) HTTP 鏈接來(lái)啟動(dòng) APP, 使用相同的網(wǎng)址打開(kāi)網(wǎng)站和 APP。
通過(guò)唯一的網(wǎng)址, 就可以鏈接一個(gè)特定的視圖到你的 APP 里面, 不需要特別的 schema 冒嫡。試想一下 Twitter 使用了通用鏈接, 那么你每在 twitter拇勃。com 點(diǎn)擊一個(gè)鏈接, 你的 iOS 設(shè)備都會(huì)在 Twitter 里面自動(dòng)打開(kāi)這個(gè)頁(yè)面, 而不是當(dāng)你沒(méi)有安裝時(shí)轉(zhuǎn)到普通的網(wǎng)頁(yè)。這個(gè)用戶體驗(yàn)是順暢的, 最重要的是用戶不會(huì)失去上下文(跳到 APP 后 Safari 上不再留下空標(biāo)簽)孝凌。
準(zhǔn)備使用通用鏈接
實(shí)現(xiàn)通用鏈接不難, 但首先必須遵守一些先決條件方咆。如下:
有一個(gè)注冊(cè)的域名

通過(guò) SSL 訪問(wèn)域名

支持上傳一個(gè) JSON 文件到你的域名

至少 iOS 9 beta 2 版本 [下載],這很重要, 因?yàn)槿绻侵暗臏y(cè)試版本你需要做額外的操作蟀架。

至少 Xcode 7 beta 2 [下載]

如果你都有了, 那就來(lái)按照下面3個(gè)步驟來(lái)做吧瓣赂。
1.添加域名到 Capabilities
首先, 你必須在 Xcode 的 capabilities 里 添加你的 APP 域名, 必須用 applinks: 前置它:還添加一些你可能擁有的子域和擴(kuò)展(www.domain.com, news.domain.com 等等)。

1441166240882211.png

用 applinks: 前綴添加所有域名, 同時(shí)不要忘了包含所有可能需要的子域名*
這將使你的 APP 從你的域名請(qǐng)求一個(gè)特殊的 JSON 文件 apple-app-site-association片拍。當(dāng)你第一次啟動(dòng) APP煌集,它會(huì)從 https://domain.com/apple-app-site-association 下載這個(gè)文件。跳到下個(gè)步驟來(lái)了解如何構(gòu)建這個(gè)文件捌省。
2.上傳 apple-app-site-association 文件
該文件必須存在且為了安全原因可使用 **SSL 通過(guò) GET **請(qǐng)求訪問(wèn)到苫纤。你可以打開(kāi)一個(gè)文本編輯器然后寫(xiě)一個(gè)這樣的簡(jiǎn)單 **JSON **格式:
1
2
3
4
5
6
7
8
9
10

{

"applinks"
: {

"apps"
: [],

"details"
: {

"TBEJCS6FFP.com.domain.App"
: {

"paths"
:[
"*"
]

}

}

}

}

根據(jù) paths 鍵設(shè)定一個(gè)允許的路徑列表(你希望APP 作出反應(yīng)的路徑), 或只是一個(gè)星號(hào)如果你想打開(kāi) APP 而不管路徑是什么。
你可能想知道 TBEJCS6FFP.com.domain.App 從何而來(lái), 基本上, 它是加入了你的團(tuán)隊(duì)標(biāo)識(shí)的 bundle id纲缓。你可以從你的 [蘋(píng)果開(kāi)發(fā)賬號(hào)頁(yè)面]獲取你的團(tuán)隊(duì)標(biāo)識(shí):

1441166528965066.png

這個(gè)頁(yè)面有你的團(tuán)隊(duì)標(biāo)識(shí), 你可以拷貝粘貼到 apple-app-site-association 文件
Bundle id 可以在項(xiàng)目的 target -- General 中找到:
1441166563609145.png

檢查 General 標(biāo)簽并拷貝粘貼 bundle id 到 apple-app-site-association 文件
最后, 上傳這個(gè)文件到你的域名根目錄方面。如果你打開(kāi) https://domain.com/apple-app-site-association 可以看到你的文件, 那么你就可以繼續(xù)下一步了。
3.在 APP 里處理通用鏈接
為了在 APP 里支持通用鏈接, 你需要在 AppDelegate 里實(shí)現(xiàn) [application(_:continueUserActivity:restorationHandler:)]色徘。 盡管這種方法可以用于許多不同的目的(比如 [Handoff]和 [搜索 API]), 我們將只關(guān)注如何處理接收到的通用鏈接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

import UIKit

extension AppDelegate {

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {

if
userActivity.activityType == NSUserActivityTypeBrowsingWeb {

let webpageURL = userActivity.webpageURL!
// Always exists

if
!handleUniversalLink(URL: webpageURL) {

UIApplication.sharedApplication().openURL(webpageURL)

}

}

return
true

}

private func handleUniversalLink(URL url: NSURL) -> Bool {

if
let components = NSURLComponents(URL: url, resolvingAgainstBaseURL:
true
), let host = components.host, let pathComponents = components.path?.pathComponents {

switch
host {

case
"domain.com"
:

if
pathComponents.count >= 4 {

switch
(pathComponents[0], pathComponents[1], pathComponents[2], pathComponents[3]) {

case
(
"/"
,
"path"
,
"to"
, let something):

if
validateSomething(something) {

presentSomethingViewController(something)

return
true

}

default
:

return
false

}

}

default
:

return
false

}

}

return
false

}

}

如果提供的 userActivity 是 NSUserActivityTypeBrowsingWeb 類(lèi)型, 那么意味著它已經(jīng)由通用鏈接 API 代理操禀。這樣的話, 它保證用戶打開(kāi)的 URL 將有一個(gè)非空的 webpageURL 屬性褂策。依據(jù)前面的例子, 這將是 http://domain.com/path/to/thezoo 的體現(xiàn)。
為了確保你的 APP 可以翻譯 URL 成實(shí)際的內(nèi)容, 你需要做下面幾步:
使用 [NSURLComponents]簡(jiǎn)單解析 webpageURL 到 host(如domain颓屑。com), 路徑組成同理(如 ["/"]斤寂、"path"、"to"以及"thezoo")揪惦。

確保能識(shí)別 host遍搞。

嘗試將 pathComponents 匹配到 APP 的已知內(nèi)容里。

驗(yàn)證該內(nèi)容實(shí)際上可以被呈現(xiàn)器腋。

呈現(xiàn)內(nèi)容給用戶溪猿。

如果上述步驟有任何一個(gè)失敗, Apple 建議你的 APP 應(yīng)該在 Safari 上打開(kāi) webpageURL 以顯示錯(cuò)誤钩杰。
總結(jié)如圖:

1441174097574453.png

上圖是通用鏈接的工作流程的概要
通用鏈接的缺點(diǎn)
通用鏈接對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)是一個(gè)好主意, 但也有一些缺點(diǎn)可能會(huì)導(dǎo)致不受青睞。
通用鏈接只適用于 iOS 9 +
配置 APP 支持通用鏈接意味著只有運(yùn)行 iOS 9 的用戶才能享用這一技術(shù)優(yōu)勢(shì)诊县。 而之前版本的用戶將不能在點(diǎn)擊網(wǎng)頁(yè)鏈接時(shí)打開(kāi) APP讲弄。 相反的, 他們將返回到瀏覽器和網(wǎng)頁(yè), 就像之前正常的網(wǎng)頁(yè)鏈接一樣。
然后, HOKO為 iOS 5 及更高版本的用戶提供了移動(dòng)深層鏈接依痊。 因此, 你的移動(dòng)深層鏈接將可以運(yùn)行在幾乎所有的 iOS 設(shè)備上, 不管它們是不是 iOS 9避除。
通用鏈接總是會(huì)返回到先前創(chuàng)建的網(wǎng)頁(yè)
如果你想退回主頁(yè)或與 APP 完全不不相關(guān)的網(wǎng)站?實(shí)現(xiàn)這一目標(biāo)需要一些額外的工作, 要配置一個(gè)網(wǎng)頁(yè)可以指引用戶到你的目標(biāo)頁(yè)面胸嘁。 此外, 如果你沒(méi)有一個(gè)網(wǎng)站的話, 這將會(huì)是一個(gè)不可能的解決方案瓶摆。
你可以使用 HOKO 智能鏈接和他們自適應(yīng)的返回來(lái)輕松的解決這個(gè)問(wèn)題。 對(duì)于創(chuàng)建的每個(gè)智能鏈接, 你可以在每個(gè)平臺(tái)上選擇如果沒(méi)有安裝 APP 會(huì)發(fā)生什么性宏。 另外你可以設(shè)置返回到你的網(wǎng)站, iTunes 商店頁(yè)面或其它外部網(wǎng)站群井。
使用通用鏈接, 開(kāi)發(fā)者必須部署一個(gè)網(wǎng)站來(lái)關(guān)聯(lián) APP
這對(duì)于小型開(kāi)發(fā)者來(lái)說(shuō)可能是個(gè)壞消息, 他們可能買(mǎi)不起或維護(hù)一個(gè)網(wǎng)站, 但是仍然想通過(guò)網(wǎng)頁(yè)鏈接進(jìn)入他們的 APP。
HOKO 可以解決這個(gè)問(wèn)題因?yàn)樗鼇?lái)充當(dāng)開(kāi)發(fā)者的網(wǎng)站, 每個(gè) APP 托管在不同的子域衔沼。 因此, 開(kāi)發(fā)者只需創(chuàng)建智能鏈接, 并發(fā)布其網(wǎng)址, 然后每次都會(huì)無(wú)縫的打開(kāi)相應(yīng)的 APP蝌借。
APP 與網(wǎng)站之間的聯(lián)系是由創(chuàng)建和托管在開(kāi)發(fā)者網(wǎng)站上的配置文件搞定的
使用 HOKO, 你可以跳過(guò)這些繁的配置, 因?yàn)槲覀兪顾梢蚤_(kāi)箱即用。 此外, 我們的服務(wù)器運(yùn)行在有行業(yè)頂級(jí)標(biāo)準(zhǔn)的安全性和性能上, 為每個(gè)設(shè)備提供安全和快速的方式指蚁。
如果你想了解更多關(guān)于 HOKO 的信息, 可以給我們發(fā)郵件或直接注冊(cè)菩佑。
(或直接檢查我們關(guān)于Google’s App Links的詳細(xì)指南)

轉(zhuǎn)載地址:

http://www.cocoachina.com/ios/20150902/13321.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凝化,隨后出現(xiàn)的幾起案子稍坯,更是在濱河造成了極大的恐慌,老刑警劉巖搓劫,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞧哟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡枪向,警方通過(guò)查閱死者的電腦和手機(jī)勤揩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秘蛔,“玉大人陨亡,你說(shuō)我怎么就攤上這事∩钤保” “怎么了负蠕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)倦畅。 經(jīng)常有香客問(wèn)我遮糖,道長(zhǎng),這世上最難降的妖魔是什么叠赐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任欲账,我火速辦了婚禮屡江,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敬惦。我一直安慰自己盼理,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布俄删。 她就那樣靜靜地躺著宏怔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畴椰。 梳的紋絲不亂的頭發(fā)上臊诊,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音斜脂,去河邊找鬼抓艳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帚戳,可吹牛的內(nèi)容都是我干的玷或。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼片任,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼偏友!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起对供,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤位他,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后产场,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鹅髓,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年京景,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窿冯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡确徙,死狀恐怖醒串,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情米愿,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布鼻吮,位于F島的核電站育苟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏椎木。R本人自食惡果不足惜违柏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一博烂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漱竖,春花似錦禽篱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至万矾,卻和暖如春悼吱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背良狈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工后添, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薪丁。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓遇西,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親严嗜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粱檀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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