公司的運維,發現最近大量的請求 /.well-known/apple-app-site-association這個文件,形成了大量的404,但是這是誰請求的呢?
實際上是蘋果從iOS9.3開始更改了通用連接的請求文件的路徑了
從原來的 /apple-app-site-association
到如今的/.well-known/apple-app-site-association
官網文檔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.
今後之後,都不須要再上傳到網站的根目錄下了,而是目錄.well-known下html
什麼是Universal Links(通用連接)?
這是iOS9推出的一項功能,若是你的應用支持Universal Links(通用連接),那麼就可以方便的經過傳統的HTTP連接來啓動APP(若是iOS設備上已經安裝了你的app,不須要額外作任何判斷等), 或者打開網頁(iOS設備上沒有安裝你的app).或許能夠更簡單點來講明,在iOS9以前,對於從各類從瀏覽器,Safari、UIWebView或者 WKWebView中喚醒APP的需求,咱們一般只能使用scheme.首先是app中註冊某個scheme,例如html5
在網頁中,ios
<a href="kaola://www.kaola.com">打開APP</a> <!-- 呼叫號碼 --> <a href="tel://13788889999">打開撥號</a> <a href="sms:1-408-555-1212">打開系統的短信app</a>
可是這種方式有個很差的地方,就是須要提早判斷系統中是否安裝了可以響應此scheme的app,這個判斷,網上不少,例如從瀏覽器或者Webview 中喚醒APP,如文章所描述的那樣,不少網頁中的判斷是有問題的,常常會出現空白頁,跳轉不了等.更加悲催的是這種經過scheme方式來打開其它的app的方式,在微信中是被禁用了的.這意味着從微信的app中,是無法打開咱們的app的.git
Universal Links(通用連接):一條普通的http連接,例如https://yohunl.com/openApp, 當你支持通用連接的時候,系統中安裝了你的app,那麼用戶點擊連接,就直接進入到你的app中了,不管你是在微信中仍是在其它哪裏!!! 當你沒有安裝的時候,你能夠去到你指定的頁面(你能夠直接展現你原來的H5頁面,也能夠跳轉到下載頁等).也就是說,用戶無需知道你是否安裝了app,如 果安裝了,這條連接就能夠進app(進入你app了,你就能夠以本地原生頁面去展現信息給用戶了),沒有安裝,就直接進原來的h5頁面,對用戶來講,是一 個無縫的過程,很是順暢!github
官方的說明文檔web
你必須有一個域名,且這個域名的網站須要支持https,而後擁有網站的上傳到根目錄的權限(這個權限是爲了上傳一個apple指定的文件)json
{
"applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": [ "*" ] } ] } }
說明:
appID: 這裏的組成方式是 teamId.yourapp’s bundle identifier.如上面的 9JA89QQLNQ,ABCD1234都是teamId,這個值從哪來的呢?
它是從的開發者帳戶的我的中心來的,登錄你的開發者中心
com.apple.wwdc是你的方式是 teamId.yourapp’s ,在你的xcode工程中
xcode
paths:
根據 paths 鍵設定一個你的app支持的路徑列表,只有這些指定的路徑的連接,才能被app所處理,舉個例子:若是你的網站是www.yohunl.com
,你的path寫的是」/support/*」,那麼當用戶點擊www.yohunl.com/support/myDoucument
,就能夠進入你的app了,相反www.yohunl.com/other 就不會.
path是大小寫敏感的!
*號表示任意路徑.瀏覽器
上傳該文件apple-app-site-association到你的域名所對應的網站的根目錄下(其實也不必定是根目錄,例如ghost博客站點,就沒有根目錄一說,它就須要放在相應的主題目錄下),這一步是爲了蘋果能從https://你的域名/apple-app-site-associationx
h獲取到你上傳的apple-app-site-association文件.
上傳完後,本身先訪問一下,看看是否可以獲取到,用個人作例子,https://yohunl.com/apple-app-site-association ,當你點擊這個連接,應該是下載apple-app-site-association文件.
驗證該文件是否合法,蘋果爲了方便開發者,提供了一個網頁來驗證咱們編寫的這個apple-app-site-association是否合法有效,驗證網址,進入網站進行驗證
安全
在xcode工程裏進行一些配置
首先就是打開工程配置中的Associated Domains打開
在其中的Domains中填入你想支持的域名(這裏不是隨便填的,是能夠支持你須要的Universal Links的域名), 必須以 applinks: 爲前綴
例如個人填入的是
applinks:yohunl.com applinks:www.yohunl.com
蘋果將會在合適的時候,從這裏填入的域名請求文件apple-app-site-association
注意:當你打開Associated Domains後,xcode會在你的工程中添加.entitlements文件
而且若是你登錄你的開發者中心,能夠看到
,這些都是有助於你排除問題的.
到此,你的app就已經能夠支持Universal Links(通用連接)了!!!
那麼怎麼測試呢?
在iOS設備中的備忘錄中添加記事本或短信中輸入App能識別的連接,而後直接點擊此連接,就會直接跳轉到你的app了
或是長按,在出現的彈出菜單中第二項是「在’XXX’中打開」,這也表明着成功。
或是你將要測試的網址放到safari中一個網頁中,而後點擊連接,在出現的網頁上方,下滑,能夠看到有 在」XX」應用中打開 (不少教程上說,在safari中直接點擊,就會跳轉到app,可是通過我實際驗證,是不能夠的,多是蘋果又調整了一下策略吧)
在微信的網頁瀏覽器中,也是能夠的,雖然微信屏蔽了全部的custom scheme方式的跳轉到其它app,可是Universal Links(通用連接)由於是普通的http連接,由系統直接處理的,微信屏蔽不了,這也就實現了從微信跳轉到咱們的app!!
如今用戶點擊某個連接,直接能夠進咱們的app了,可是,這不是咱們的最終目的,咱們的目的是要可以獲取到用戶進來的連接,根據連接來處理,須要展現給用戶的信息
在工程裏的 AppDelegate 裏實現 方法
- (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"]) { //進行咱們須要的處理 } else { [[UIApplication sharedApplication]openURL:webpageURL]; } } return YES; }
當 userActivity 是 NSUserActivityTypeBrowsingWeb 類型, 則意味着它是由Universal Links進來的,就能夠添加咱們本身的處理邏輯了!
若是遇到不能起做用,http://stackoverflow.com/questions/32751225/ios9-universal-links-does-not-work上有討論各類可能出現的問題 ,你能夠去參考下