一层皱、通用鏈接簡介
在iOS9之前狈蚤,對于從各種從瀏覽器奴曙、Safari中喚醒APP的需求欲主,我們通常只能使用scheme邓厕。但是這種方式需要提前判斷系統(tǒng)中是否安裝了能夠響應(yīng)此scheme的app逝嚎,并且這種方式在微信中是被禁用了的。
通用鏈接(Universal Links)是iOS9推出的一項功能详恼,使你的應(yīng)用可以通過傳統(tǒng)的HTTP鏈接來啟動APP(如果iOS設(shè)備上已經(jīng)安裝了你的app补君,不管在微信里還是在哪里), 或者打開網(wǎng)頁(iOS設(shè)備上沒有安裝你的app)昧互。
通用鏈接為您提供了使用自定義URL方案時無法獲得的幾個主要優(yōu)勢挽铁。具體而言,通用鏈接是:
- 獨特敞掘。與自定義網(wǎng)址方案不同叽掘,其他應(yīng)用無法聲明通用鏈接,因為它們使用指向您網(wǎng)站的標(biāo)準(zhǔn)HTTP或HTTPS鏈接玖雁。
- 安全更扁。當(dāng)用戶安裝您的應(yīng)用時,iOS會檢查您上傳到網(wǎng)絡(luò)服務(wù)器的文件赫冬,以確保您的網(wǎng)站允許您的應(yīng)用代表其打開網(wǎng)址浓镜。只有您可以創(chuàng)建并上傳此文件,因此您的網(wǎng)站與應(yīng)用的關(guān)聯(lián)是安全的劲厌。
- 靈活膛薛。即使您的應(yīng)用未安裝,通用鏈接也能正常工作补鼻。未安裝您的應(yīng)用時哄啄,點按指向您網(wǎng)站的鏈接會在用戶期望的Safari中打開內(nèi)容。
- 簡單风范。一個URL適用于您的網(wǎng)站和您的應(yīng)用咨跌。
- 私人的。其他應(yīng)用可以與您的應(yīng)用進行通信乌企,而無需知道您的應(yīng)用是否已安裝虑润。
注意
1、通用鏈接允許用戶在點擊您網(wǎng)站內(nèi)的鏈接WKWebView和UIWebView視圖以及Safari頁面時打開您的應(yīng)用加酵,此外還有導(dǎo)致呼叫的鏈接openURL:拳喻,例如郵件,消息和其他應(yīng)用中出現(xiàn)的鏈接猪腕。
2冗澈、當(dāng)用戶在Safari中瀏覽您的網(wǎng)站并且他們點擊與當(dāng)前網(wǎng)頁位于同一域中的URL的通用鏈接時,iOS會尊重用戶最可能的意圖并在Safari中打開該鏈接陋葡。如果用戶點擊通向不同域中網(wǎng)址的通用鏈接亚亲,iOS會在您的應(yīng)用中打開該鏈接。
3、對于運行早于9.0版本的iOS的用戶捌归,點擊指向您網(wǎng)站的通用鏈接會在Safari中打開該鏈接肛响。
二、配置通用鏈接
1惜索、配置開發(fā)證書
需要在開發(fā)者中心做配置:找到對應(yīng)的App ID特笋,在Application Services列表里有Associated Domains一條,把它變?yōu)镋nabled就可以了巾兆。
2猎物、配置Capabilitles
進入項目的Targets
->Capabilites
->Associated Domains
,設(shè)置成ON狀態(tài)。在其中的Domains中填入你想支持的域名角塑,必須以applinks:
為前綴蔫磨,后面添加通用鏈接的域名,這里以 www.baidu.com
為例
3圃伶、創(chuàng)建關(guān)聯(lián)文件apple-app-site-association
創(chuàng)建一個內(nèi)容為json格式的文件堤如,蘋果將會在合適的時候,從我們在項目中填入的域名請求這個文件窒朋。這個文件名必須為apple-app-site-association煤惩,沒有后綴名,文件內(nèi)容大概是這樣子:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
注意
1炼邀、不要附加.json到apple-app-site-association文件名。
2剪侮、appID:組成方式是 teamId.yourapp’s bundle identifier拭宁。如上面的 9JA89QQLNQ就是teamId。登陸開發(fā)者中心瓣俯,在Account - Membership里面可以找到Team ID
3杰标、paths:設(shè)定你的app支持的路徑列表,只有這些指定的路徑的鏈接彩匕,才能被app所處理腔剂。星號的寫法代表了可識別域名下所有鏈接。
paths要指定不應(yīng)作為通用鏈接處理的區(qū)域驼仪,請在路徑字符串的開頭添加“NOT
”(包括后面的空格T)掸犬。例如,apple-app-site-association
顯示的文件可能會阻止/videos/wwdc/2010/*
通過更新paths數(shù)組將網(wǎng)站區(qū)域作為通用鏈接處理绪爸,如下所示:
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/*", "/videos/wwdc/201?/*"]
因為系統(tǒng)paths按照指定的順序評估數(shù)組中的每個路徑湾碎,并且在找到正匹配或負匹配時停止評估,您應(yīng)該在低優(yōu)先級路徑之前指定高優(yōu)先級路徑奠货。請注意介褥,只有URL的路徑組件用于比較,其他組件(例如查詢字符串或片段標(biāo)識符)將被忽略。
有多種方法可以在apple-app-site-association
文件中指定網(wǎng)站路徑柔滔。例如溢陪,您可以:
- 使用 * 指定整個網(wǎng)站
- 包括特定的URL,例如
/wwdc/news/
睛廊,以指定特定的鏈接 - 附加 * 到特定網(wǎng)址形真,例如
/videos/wwdc/2015/*
,指定您網(wǎng)站的某個部分 - 除了用于 * 匹配任何子字符串之外喉前,您還可以使用 ? 匹配任何單個字符没酣。您可以將兩個通配符組合在一個路徑中,例如
/foo/*/bar/201?/mypage
卵迂。
注意:
用于指定paths陣列中網(wǎng)站路徑的字符串區(qū)分大小寫裕便。
4、上傳關(guān)聯(lián)文件apple-app-site-association
上傳該文件到你的域名所對應(yīng)的根目錄
或者.well-known
目錄下见咒,這是為了蘋果能獲取到你上傳的文件偿衰。上傳完后,自己先訪問一下,看看是否能夠獲取到,當(dāng)你在瀏覽器中輸入這個文件鏈接后改览,應(yīng)該是直接下載apple-app-site-association
文件下翎。如以知乎為例:https://www.zhihu.com/apple-app-site-association
三、驗證通用鏈接
1宝当、抓包驗證
我們創(chuàng)建apple-app-site-association
文件的目的是為了讓iOS系統(tǒng)能獲取這個文件视事,知道你的哪些是鏈接是Universal Links
,哪些不是Universal Links
庆揩。所以在你第一次安裝APP時俐东,iOS系統(tǒng)會去對應(yīng)的路徑下拿取apple-app-site-association
文件,所以我們可以通過抓包來判斷通不通订晌。另外直接用Xcode debug調(diào)試APP時虏辫,iOS也會去拿取apple-app-site-association
文件。
2、訪問驗證
在iOS設(shè)備中的備忘錄中輸入App能識別的鏈接,然后直接點擊此鏈接渔扎,就會直接跳轉(zhuǎn)到你的app了÷ィ或是長按,在出現(xiàn)的彈出菜單中第二項是在’XXX’中打開
验辞,這也代表著成功稿黄。這里使用知乎
的鏈接為例:https://www.zhihu.com/question/345124567
如果你選擇在Safari中打開,上下滑動頁面跌造,你會發(fā)現(xiàn)仍然有一個按鈕可以打開你的應(yīng)用杆怕。
3族购、驗證失敗原因推測
- TeamId不對,要使用開發(fā)者中心賬號下的TeamID
- 域名不是https請求
- 服務(wù)器端的SSL證書有問題(偽證書或者無效證書)
- 服務(wù)器端的證書配置有問題
四陵珍、結(jié)合NFC使用
1寝杖、AppDelegate處理Universal Links
用戶點擊某個鏈接,直接可以進我們的app了互纯,但是我們的目的是要能夠獲取到用戶進來的鏈接瑟幕,根據(jù)鏈接來展示給用戶相應(yīng)的內(nèi)容。我們需要在工程里的 AppDelegate
里實現(xiàn)回調(diào)方法:
/// 通用鏈接回調(diào)方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
// 通用鏈
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *url = userActivity.webpageURL;
NSLog(@"通用鏈接 :%@", url);
}
return YES;
}
Demo下載:https://github.com/ZhangJingHao/ZJHNFCDemo
2留潦、NFC后臺讀取通用鏈接
NFC的相關(guān)介紹只盹,請參考這邊文章:iOS NFC功能集成及詳解
iPhone XS及更高版本支持后臺標(biāo)簽讀取。系統(tǒng)掃描并讀取NFC數(shù)據(jù)兔院,而無需用戶使用應(yīng)用程序掃描標(biāo)簽殖卑。每次讀取新標(biāo)簽時,系統(tǒng)都會顯示彈出通知坊萝。用戶點擊通知后孵稽,系統(tǒng)會將標(biāo)記數(shù)據(jù)傳遞到相應(yīng)的應(yīng)用程序。如果iPhone被鎖定十偶,系統(tǒng)會在將標(biāo)簽數(shù)據(jù)提供給應(yīng)用程序之前提示用戶解鎖手機菩鲜。
首先將鏈接信息寫入NFC標(biāo)簽,這里以知乎鏈接為例:https://www.zhihu.com/question/345124567
當(dāng)掃描普通鏈接惦积,或未安裝相應(yīng)應(yīng)用的app時接校,會彈出Safari打開通知彈框,點擊會跳轉(zhuǎn)到Safari狮崩。
當(dāng)掃描已配置好的通用鏈接馅笙,且安裝了該app,會彈出使用app打開的通知彈框厉亏,點擊會跳轉(zhuǎn)到對應(yīng)的app。
參考鏈接:
iOS Universal Links(通用鏈接)的使用
iOS 9 通用鏈接(Universal Links)
Support Universal Links
Adding Support for Background Tag Reading