當(dāng)您支持通用鏈接時,iOS用戶可以點(diǎn)擊指向您網(wǎng)站的鏈接并無縫重定向到您已安裝的應(yīng)用程序,而無需通過Safari。 如果未安裝您的應(yīng)用,用戶點(diǎn)擊指向您網(wǎng)站的鏈接時會在Safari中打開您的網(wǎng)站。
通用鏈接為您提供了使用自定義URL方案時無法獲得的幾個關(guān)鍵好處。具體來說,通用鏈接有以下幾個好處:
1. Unique(唯一性):與自定義URL方案不同,通用鏈接不可以被其他的app聲明,因?yàn)樗鼈兪褂脴?biāo)準(zhǔn)的HTTP或HTTPS協(xié)議鏈接到您的網(wǎng)站。
2.Secure(安全性):當(dāng)用戶安裝了你的app時,iOS會檢查你上傳到網(wǎng)絡(luò)服務(wù)器的文件,以確保你的網(wǎng)站允許你的應(yīng)用程序打開它的URL。只有你創(chuàng)建并上傳了這個文件,這樣你的網(wǎng)站和你的app的關(guān)聯(lián)才是安全的。
3.Flexible(靈活性):即使你的app沒有被用戶安裝,通用鏈接也可以正常工作。當(dāng)你的app沒有被安裝時,點(diǎn)擊一個鏈接就會在Safari中打開你的網(wǎng)站,這正是用戶所希望的。
4.Simple(簡單性):一個URL對你的網(wǎng)站和app都有效。
5.Private(私密性):其他的app可以與你的app進(jìn)行通信,而不需要知道你的app是否被已經(jīng)安裝了。
注意:
通用鏈接使用戶可以在點(diǎn)擊WKWebView和UIWebView視圖以及Safari頁面中的網(wǎng)站鏈接時打開您的應(yīng)用程序,此外也可以響應(yīng)郵件,信息或者其他app中調(diào)用openURL:的鏈接。
當(dāng)用戶在Safari瀏覽器中瀏覽你的網(wǎng)站時,他們點(diǎn)擊了一個指向與當(dāng)前網(wǎng)頁相同域的URL的通用鏈接,iOS會尊重用戶最有可能的意圖,并在Safari中打開該鏈接。如果用戶點(diǎn)擊一個通用鏈接到另一個域的URL, iOS會在你的應(yīng)用程序中打開這個鏈接。
對于運(yùn)行9.0之前的iOS版本的用戶,點(diǎn)擊指向您網(wǎng)站的通用鏈接會在Safari中打開該鏈接。
添加對通用鏈接的支持很容易。 您需要執(zhí)行三個步驟:
○ 創(chuàng)建一個apple-app-site-association文件,其中包含有關(guān)您的應(yīng)用程序可以處理的URL的JSON數(shù)據(jù)。
○ 將apple-app-site-association文件上傳到您的HTTPS Web服務(wù)器。 您可以將文件放在服務(wù)器的根目錄或.well-known子目錄中。
○?讓您的app做好準(zhǔn)備以處理通用鏈接。
您可以在設(shè)備上測試通用鏈接。
創(chuàng)建和上傳關(guān)聯(lián)文件
要在您的網(wǎng)站和應(yīng)用之間建立安全連接,您需要在它們之間建立信任關(guān)系。 您可以分為兩部分來建立這種關(guān)系:
○?在您的網(wǎng)站添加apple-app-site-association文件。
○?在您的app中添加一個com.apple.developer.associated-domains的權(quán)利(這一部分在?Preparing Your App to Handle Universal Links中進(jìn)行了描述)。
您可以在Shared Web Credentials Reference中了解有關(guān)您的應(yīng)用程序和網(wǎng)站如何共享憑據(jù)的更多信息。
注意
如果您的應(yīng)用程序在iOS 9或更高版本中運(yùn)行,并且您使用HTTPS來提供apple-app-site-association文件,則可以創(chuàng)建一個使用application / json MIME類型的純文本文件,而無需對其進(jìn)行簽名。 如果您在iOS 8中支持交接和共享Web憑據(jù),則仍然需要按照Shared Web Credentials Reference中的說明對文件進(jìn)行簽名。
您需要為每個域提供一個單獨(dú)的apple-app-site-association文件,其中包含您的應(yīng)用支持的唯一內(nèi)容。 例如,apple.com和developer.apple.com需要單獨(dú)的apple-app-site-association文件,因?yàn)檫@些域提供不同的內(nèi)容。 相比之下,apple.com和www.apple.com不需要單獨(dú)的站點(diǎn)關(guān)聯(lián)文件-因?yàn)閮蓚€域都提供相同的內(nèi)容-但是兩個域都必須使文件可用。 對于在iOS 9.3.1和更高版本中運(yùn)行的應(yīng)用程序,無論文件是否經(jīng)過簽名,apple-app-site-association文件的未壓縮大小都不得大于128 KB。
在apple-app-site-association文件中,指定網(wǎng)站中應(yīng)被視為通用鏈接的路徑以及不應(yīng)被視為通用鏈接的路徑。 保持路徑列表簡短,并依靠通配符匹配來匹配較大的路徑集。 清單6-1顯示了一個apple-app-site-association文件的示例,該文件標(biāo)識了應(yīng)作為通用鏈接處理的三個路徑。

注意:
不要將.json附加到apple-app-site-association文件名。
apple-app-site-association文件中的apps密鑰必須存在,并且其值必須為空數(shù)組,如清單6-1所示。 details鍵的值是一個字典數(shù)組,您的網(wǎng)站支持的每個應(yīng)用程序一個字典。 數(shù)組中字典的順序決定了系統(tǒng)在尋找匹配項(xiàng)時所遵循的順序,因此您可以指定一個應(yīng)用來處理網(wǎng)站的特定部分。
每個特定于應(yīng)用程序的詞典都包含一個appID鍵和一個路徑鍵。 appID密鑰的值是團(tuán)隊(duì)ID或應(yīng)用程序ID前綴,后跟捆綁軟件ID。 (appID值與構(gòu)建后與應(yīng)用程序entitlements中的“ application-identifier”鍵相關(guān)聯(lián)的值相同。)paths密鑰的值是一個字符串?dāng)?shù)組,用于指定網(wǎng)站所支持的部分 該應(yīng)用程序以及您不想與該應(yīng)用程序關(guān)聯(lián)的網(wǎng)站部分。 要指定不應(yīng)作為通用鏈接處理的區(qū)域,請?jiān)诼窂阶址拈_頭添加"NOT "(包括T后面的空格)。 例如,清單6-1中顯示的apple-app-site-association文件可以通過更新paths數(shù)組來防止將網(wǎng)站的/ videos / wwdc / 2010 / *區(qū)域視為通用鏈接,如下所示:

因?yàn)橄到y(tǒng)按照指定的順序評估path數(shù)組中的每個路徑,并且在找到可以匹配或不可以匹配時停止評估,所以您應(yīng)在低優(yōu)先級路徑之前指定高優(yōu)先級路徑。 請注意,僅將URL的路徑部分用于比較。 其他組件(例如查詢字符串或片段標(biāo)識符)將被忽略(Note that only the path component of the URL is used for comparison. Other components, such as the query string or fragment identifier, are ignored)。
有多種方法可以在apple-app-site-association文件中指定網(wǎng)站路徑。 例如,您可以:
○?使用*指定整個網(wǎng)站
○?包括一個特定的URL,例如/ wwdc / news /,以指定一個特定的鏈接
○?將*附加到特定的網(wǎng)址(例如/ videos / wwdc / 2015 / *),以指定網(wǎng)站的一部分。除了使用*匹配任何子字符串外,還可以使用? 匹配任何單個字符。 您可以將兩個通配符合并在一個路徑中,例如/ foo / * / bar / 201?/ mypage。
注意
用于在path數(shù)組中指定網(wǎng)站路徑的字符串區(qū)分大小寫。
創(chuàng)建apple-app-site-association文件后,將其上傳到HTTPS Web服務(wù)器的根目錄或.well-known子目錄。 該文件需要通過HTTPS進(jìn)行訪問(無任何重定向),位于https://<domain>/apple-app-site-association或https://<domain>/.well-known/apple-app-site-association 。接下來,您需要處理應(yīng)用程序中的通用鏈接。
準(zhǔn)備您的app以處理通用鏈接
通用鏈接使用兩種技術(shù):第一種是在Web瀏覽器和本機(jī)應(yīng)用程序之間提供切換功能的相同機(jī)制,第二種是共享Web憑據(jù)(有關(guān)這些技術(shù)的更多信息,請參閱Web Browser–to–Native App Handoff?和?Shared Web Credentials Reference)。 當(dāng)用戶點(diǎn)擊通用鏈接時,iOS將啟動您的app并向其發(fā)送一個NSUserActivity對象,您可以查詢該對象以了解您的app是如何啟動的。
要在您的app中支持通用鏈接,請執(zhí)行以下步驟:
○ 添加一個entitlement以指定您的app所支持的domain
○?更新您的應(yīng)用程序委托以在收到NSUserActivity對象時做出適當(dāng)響應(yīng)。
在您的com.apple.developer.associated-domains entitlement中,包括您的app希望作為通用鏈接處理的domains的列表。 若要在Xcode中執(zhí)行此操作,請?jiān)凇癈apabilities”選項(xiàng)卡中打開“Associated Domains section”部分,并為您的app支持的每個domain添加一個條目,并以applinks:為前綴,例如applinks:www.mywebsite.com。 將該列表限制為不超過20到30個域。
要匹配關(guān)聯(lián)domain的所有子domain,可以通過在前綴*之前指定通配符。在特定domain的開頭之前(必須輸入.)。domain匹配基于applinks條目中最長的子字符串。例如,如果您指定條目applinks:*.mywebsite.com和applinks:*.users.mywebsite.com,則對domainemily.users.mywebsite.com的匹配是針對較長的*.users.mywebsite.com條目執(zhí)行的。請注意,*.mywebsite.com的條目與星號后的.不匹配,因此與mywebsite.com不匹配。若要同時為*.mywebsite.com和mywebsite.com進(jìn)行匹配,您需要為每個提供單獨(dú)的applinks條目。
在指定關(guān)聯(lián)的domain后,采用UIApplicationDelegate中處理Handoff的方法(即application:continueUserActivity:restorationHandler:),以便您的app可以接收鏈接并適當(dāng)?shù)靥幚硭?/p>
當(dāng)用戶點(diǎn)擊通用鏈接后iOS啟動您的app時,您會收到一個NSUserActivity對象,其ActivityType值為NSUserActivityTypeBrowsingWeb。 activity object的webpageURL屬性包含用戶正在訪問的URL。 網(wǎng)頁URL屬性始終包含HTTP或HTTPS URL,并且您可以使用NSURLComponents API來操縱URL的組件。
注意
如果您實(shí)例化SFSafariViewController,WKWebView或UIWebView對象以處理通用鏈接,則iOS會在Safari中打開您的網(wǎng)站,而不是打開您的應(yīng)用程序。 但是,如果用戶從嵌入式SFSafariViewController,WKWebView或UIWebView對象中點(diǎn)擊通用鏈接,則iOS將打開您的應(yīng)用程序。
請務(wù)必了解,如果您的app使用openURL:?打開指向您網(wǎng)站的通用鏈接,則該鏈接不會在您的app中打開。 在這種情況下,iOS會識別出呼叫來自您的app,因此您的應(yīng)用程序不會將其視為通用鏈接。
重要:
為了保護(hù)用戶的隱私和安全,當(dāng)您需要傳輸數(shù)據(jù)時,請勿使用HTTP。 而是使用安全傳輸協(xié)議,例如HTTPS。