iOS Universal Links(通用鏈接)

本文的原地址是 https://yohunl.com/ios-universal-links-tong-yong-lian-jie/,轉(zhuǎn)載請(qǐng)注明

2016.07.08更新

公司的運(yùn)維,發(fā)現(xiàn)最近大量的請(qǐng)求 /.well-known/apple-app-site-association這個(gè)文件,造成了大量的404,可是這是誰(shuí)請(qǐng)求的呢?
其實(shí)是蘋果從iOS9.3開(kāi)始更改了通用鏈接的請(qǐng)求文件的路徑了
從原來(lái)的 /apple-app-site-association 到現(xiàn)在的/.well-known/apple-app-site-association
官網(wǎng)文檔UniversalLinks文檔中
Upload the apple-app-site-association file to your HTTPS web server. You can place the file at the root of your server or in the .well-known subdirectory.
從此以后,都不需要再上傳到網(wǎng)站的根目錄下了,而是目錄.well-known下

簡(jiǎn)介

什么是Universal Links(通用鏈接)?
這是iOS9推出的一項(xiàng)功能,如果你的應(yīng)用支持Universal Links(通用鏈接),那么就能夠方便的通過(guò)傳統(tǒng)的HTTP鏈接來(lái)啟動(dòng)APP(如果iOS設(shè)備上已經(jīng)安裝了你的app,不需要額外做任何判斷等), 或者打開(kāi)網(wǎng)頁(yè)(iOS設(shè)備上沒(méi)有安裝你的app).或許可以更簡(jiǎn)單點(diǎn)來(lái)說(shuō)明,在iOS9之前,對(duì)于從各種從瀏覽器,Safari、UIWebView或者 WKWebView中喚醒APP的需求,我們通常只能使用scheme.首先是app中注冊(cè)某個(gè)scheme,例如

在網(wǎng)頁(yè)中,

<a href="kaola://www.kaola.com">打開(kāi)APP</a>
<!-- 呼叫號(hào)碼 -->
<a href="tel://13788889999">打開(kāi)撥號(hào)</a>
<a href="sms:1-408-555-1212">打開(kāi)系統(tǒng)的短信app</a>

但是這種方式有個(gè)不好的地方,就是需要提前判斷系統(tǒng)中是否安裝了能夠響應(yīng)此scheme的app,這個(gè)判斷,網(wǎng)上很多,例如從瀏覽器或者Webview 中喚醒APP,如文章所描述的那樣,很多網(wǎng)頁(yè)中的判斷是有問(wèn)題的,經(jīng)常會(huì)出現(xiàn)空白頁(yè),跳轉(zhuǎn)不了等.更加悲催的是這種通過(guò)scheme方式來(lái)打開(kāi)其它的app的方式,在微信中是被禁用了的.這意味著從微信的app中,是沒(méi)法打開(kāi)我們的app的.

Universal Links(通用鏈接):一條普通的http鏈接,例如https://yohunl.com/openApp,當(dāng)你支持通用鏈接的時(shí)候,系統(tǒng)中安裝了你的app,那么用戶點(diǎn)擊鏈接,就直接進(jìn)入到你的app中了,無(wú)論你是在微信中還是在其它哪里!!! 當(dāng)你沒(méi)有安裝的時(shí)候,你可以去到你指定的頁(yè)面(你可以直接展示你原來(lái)的H5頁(yè)面,也可以跳轉(zhuǎn)到下載頁(yè)等).也就是說(shuō),用戶無(wú)需知道你是否安裝了app,如果安裝了,這條鏈接就可以進(jìn)app(進(jìn)入你app了,你就可以以本地原生頁(yè)面去展示信息給用戶了),沒(méi)有安裝,就直接進(jìn)原來(lái)的h5頁(yè)面,對(duì)用戶來(lái)說(shuō),是一個(gè)無(wú)縫的過(guò)程,非常順暢!

官方的說(shuō)明文檔

Universal Links(通用鏈接)的優(yōu)點(diǎn)

  • 唯一性: 不像自定義的scheme,因?yàn)樗褂脴?biāo)準(zhǔn)的http/https鏈接到你的web站點(diǎn),所以它不會(huì)被其它的app所聲明.另外,Custom URL scheme 因?yàn)槭亲远x的協(xié)議,所以在沒(méi)有安裝 app 的情況下是無(wú)法直接打開(kāi)的,而 universal links 本身是一個(gè) HTTP/HTTPS 鏈接,所以有更好的兼容性
  • 安全:當(dāng)用戶的手機(jī)上安裝了你的app,那么iOS將去你的網(wǎng)站上去下載你上傳上去的說(shuō)明文件(這個(gè)說(shuō)明文件聲明了你的app可以打開(kāi)哪些類型的http鏈接).因?yàn)橹挥心阕约翰拍苌蟼魑募侥憔W(wǎng)站的根目錄,所以你的網(wǎng)站和你的app之間的關(guān)聯(lián)是安全的.
  • 可變:當(dāng)用戶手機(jī)上沒(méi)有安裝你的app的時(shí)候,Universal Links也能夠工作.如果你愿意,在沒(méi)有安裝你的app的時(shí)候,用戶點(diǎn)擊鏈接,會(huì)在safari中展示你網(wǎng)站的內(nèi)容.
  • 簡(jiǎn)單:一個(gè)URL鏈接,可以同時(shí)作用于網(wǎng)站和app
  • 私有 其它app可以在不需要知道你的app是否安裝了的情況下和你的app相互通信.

怎么支持Universal Links(通用鏈接)

先決條件:

你必須有一個(gè)域名,且這個(gè)域名的網(wǎng)站需要支持https,然后擁有網(wǎng)站的上傳到根目錄的權(quán)限(這個(gè)權(quán)限是為了上傳一個(gè)apple指定的文件)

支持Universal Links(通用鏈接)

  • 創(chuàng)建一個(gè)json格式的命名為apple-app-site-association文件,注意這個(gè)文件必須沒(méi)有后綴名,文件名必須為apple-app-site-association!!!
{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
            },
            {
                "appID": "ABCD1234.com.apple.wwdc",
                "paths": [ "*" ]
            }
        ]
    }
}

說(shuō)明:
appID: 這里的組成方式是 teamId.yourapp's bundle identifier.如上面的 9JA89QQLNQ,ABCD1234都是teamId,這個(gè)值從哪來(lái)的呢?
它是從的開(kāi)發(fā)者賬戶的個(gè)人中心來(lái)的,登陸你的開(kāi)發(fā)者中心


com.apple.wwdc是你的方式是 teamId.yourapp's ,在你的xcode工程中

paths:
根據(jù) paths 鍵設(shè)定一個(gè)你的app支持的路徑列表,只有這些指定的路徑的鏈接,才能被app所處理,舉個(gè)例子:如果你的網(wǎng)站是www.yohunl.com,你的path寫的是"/support/*",那么當(dāng)用戶點(diǎn)擊www.yohunl.com/support/myDoucument,就可以進(jìn)入你的app了,相反www.yohunl.com/other 就不會(huì).
path是大小寫敏感的!
*號(hào)表示任意路徑.

  • 上傳該文件apple-app-site-association到你的域名所對(duì)應(yīng)的網(wǎng)站的根目錄下(其實(shí)也不一定是根目錄,例如ghost博客站點(diǎn),就沒(méi)有根目錄一說(shuō),它就需要放在相應(yīng)的主題目錄下),這一步是為了蘋果能從https://你的域名/apple-app-site-associationxh獲取到你上傳的apple-app-site-association文件.
    上傳完后,自己先訪問(wèn)一下,看看是否能夠獲取到,用我的做例子,https://yohunl.com/apple-app-site-association ,當(dāng)你點(diǎn)擊這個(gè)鏈接,應(yīng)該是下載apple-app-site-association文件.
    驗(yàn)證該文件是否合法,蘋果為了方便開(kāi)發(fā)者,提供了一個(gè)網(wǎng)頁(yè)來(lái)驗(yàn)證我們編寫的這個(gè)apple-app-site-association是否合法有效,驗(yàn)證網(wǎng)址,進(jìn)入網(wǎng)站進(jìn)行驗(yàn)證
  • 在xcode工程里進(jìn)行一些配置
    首先就是打開(kāi)工程配置中的Associated Domains打開(kāi)

    在其中的Domains中填入你想支持的域名(這里不是隨便填的,是可以支持你需要的Universal Links的域名), 必須以 applinks: 為前綴
    例如我的填入的是
applinks:yohunl.com
applinks:www.yohunl.com

蘋果將會(huì)在合適的時(shí)候,從這里填入的域名請(qǐng)求文件apple-app-site-association

注意:當(dāng)你打開(kāi)Associated Domains后,xcode會(huì)在你的工程中添加.entitlements文件


并且如果你登陸你的開(kāi)發(fā)者中心,可以看到


,這些都是有助于你排除問(wèn)題的.

到此,你的app就已經(jīng)可以支持Universal Links(通用鏈接)了!!!
那么怎么測(cè)試呢?

測(cè)試Universal Links(通用鏈接)是否生效

在iOS設(shè)備中的備忘錄中添加記事本或短信中輸入App能識(shí)別的鏈接,然后直接點(diǎn)擊此鏈接,就會(huì)直接跳轉(zhuǎn)到你的app了
或是長(zhǎng)按,在出現(xiàn)的彈出菜單中第二項(xiàng)是“在'XXX'中打開(kāi)”,這也代表著成功。


或是你將要測(cè)試的網(wǎng)址放到safari中一個(gè)網(wǎng)頁(yè)中,然后點(diǎn)擊鏈接,在出現(xiàn)的網(wǎng)頁(yè)上方,下滑,可以看到有 在"XX"應(yīng)用中打開(kāi) (很多教程上說(shuō),在safari中直接點(diǎn)擊,就會(huì)跳轉(zhuǎn)到app,但是經(jīng)過(guò)我實(shí)際驗(yàn)證,是不可以的,可能是蘋果又調(diào)整了一下策略吧)

在微信的網(wǎng)頁(yè)瀏覽器中,也是可以的,雖然微信屏蔽了所有的custom scheme方式的跳轉(zhuǎn)到其它app,但是Universal Links(通用鏈接)因?yàn)槭瞧胀ǖ膆ttp鏈接,由系統(tǒng)直接處理的,微信屏蔽不了,這也就實(shí)現(xiàn)了從微信跳轉(zhuǎn)到我們的app!!

工程中添加處理方法

現(xiàn)在用戶點(diǎn)擊某個(gè)鏈接,直接可以進(jìn)我們的app了,但是,這不是我們的最終目的,我們的目的是要能夠獲取到用戶進(jìn)來(lái)的鏈接,根據(jù)鏈接來(lái)處理,需要展示給用戶的信息

在工程里的 AppDelegate 里實(shí)現(xiàn) 方法

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler
{
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *webpageURL = userActivity.webpageURL;
        NSString *host = webpageURL.host;
        if ([host isEqualToString:@"yohunl.com"]) {
            //進(jìn)行我們需要的處理
        }
        else {
            [[UIApplication sharedApplication]openURL:webpageURL];
        }
        
    }
    return YES;
    
}

當(dāng) userActivity 是 NSUserActivityTypeBrowsingWeb 類型, 則意味著它是由Universal Links進(jìn)來(lái)的,就可以添加我們自己的處理邏輯了!

后記

如果遇到不能起作用,http://stackoverflow.com/questions/32751225/ios9-universal-links-does-not-work上有討論各種可能出現(xiàn)的問(wèn)題 ,你可以去參考下

參考

  1. iOS 9學(xué)習(xí)系列:打通 iOS 9 的通用鏈接(Universal Links)
  2. 蘋果官方Universal Links
  3. iOS9 Universal Links
  4. 國(guó)外人列舉的當(dāng)前支持Universal Links的app和其apple-app-site-association文件 51個(gè)應(yīng)用的文件列表
  5. 查看是否支持 Universal Links的蘋果網(wǎng)站 網(wǎng)址
最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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