iOS Universal Links(通用鏈接)

簡(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)。

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)站的上傳到.well-known目錄的權(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)站的.well-known目錄下(其實(shí)也不一定是根目錄,例如ghost博客站點(diǎn),就沒(méi)有根目錄一說(shuō),它就需要放在相應(yīng)的主題目錄下),這一步是為了蘋果能從https://你的域名/.well-known/apple-app-site-associationxh獲取到你上傳的apple-app-site-association文件.
    上傳完后,自己先訪問(wèn)一下,看看是否能夠獲取到,用我的做例子,https://yohunl.com/.well-known/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)證
    image
  • 在xcode工程里進(jìn)行一些配置 首先就是打開(kāi)工程配置中的Associated Domains打開(kāi)


    image

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

applinks:baidu.com  
applinks:www.baidu.com

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

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

image

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

image

,這些都是有助于你排除問(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)”,這也代表著成功。
image

或是你將要測(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)整了一下策略吧)
image

在微信的網(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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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