簡(jiǎn)介
大家好!我是Tony,一個(gè)熱愛(ài)技術(shù),希望運(yùn)用技術(shù)改變生活的的追夢(mèng)男孩。本文是對(duì)Universal Link的總結(jié),參考資料來(lái)自蘋果開(kāi)發(fā)文檔(command+shift+0可以打開(kāi))。內(nèi)容主要包含三部分:
- 開(kāi)啟Universal Links
- 處理Universal Links
- 自定義URLs
Universal Links的能力
讓其他運(yùn)用程序或者websites可以打開(kāi)你的app,完成用戶的某項(xiàng)需求。
開(kāi)啟Universal Links
開(kāi)啟的步驟如下:
設(shè)置app的Associated Domains
我的Xcode版本是11.1,在工程的target->signing&Capabilities->Capability,設(shè)置格式:
以添加帶有webcredentials:前綴的占位符域。 將占位符替換為您網(wǎng)站的域,并保留前綴。
image.png
添加apple-app-site-association文件到websites
- 新建文件apple-app-site-association(無(wú)后綴擴(kuò)展名),添加內(nèi)容如下:
{
"webcredentials": {
"apps": [ "D3KQX62K1A.com.example.DemoApp",
"D3KQX62K1A.com.example.DemoAdminApp" ]
}
}
apps
字段中各個(gè)App的格式如下<Team Identifier>.<Bundle Identifier>
。
將此文件放置在您網(wǎng)站的.well-known目錄中,或直接放置在其根目錄中。 如果使用.well-known目錄,則文件的URL應(yīng)與以下格式匹配:
https://<fully qualified domain>/.well-known/apple-app-site-association。
注意事項(xiàng)
- 您必須使用帶有有效證書(shū)的https://且不使用任何重定向來(lái)托管文件。
- 在iOS 9.3.1和更高版本中,文件不得大于128 KB(未壓縮)。 如果您的應(yīng)用程序在iOS 8中運(yùn)行,則該文件必須具有MIME類型application / pkcs7-mime,并且必須是由有效TLS證書(shū)進(jìn)行CMS簽名的文件。
驗(yàn)證Apple App網(wǎng)站關(guān)聯(lián)文件
- 如果發(fā)生以下情況,驗(yàn)證可能會(huì)失敗,并且關(guān)聯(lián)將被拒絕:
JSON文件無(wú)效或不包含應(yīng)用程序標(biāo)識(shí)符。
- 服務(wù)器返回300-499碼。 這包括重定向。
- 如果服務(wù)器返回500-599碼,則系統(tǒng)認(rèn)為該文件暫時(shí)不可用,然后重試。 默認(rèn)情況下,系統(tǒng)每三小時(shí)重試一次,最多八次。
- 應(yīng)用程序成功與域關(guān)聯(lián)后,它將保持關(guān)聯(lián)狀態(tài),直到從設(shè)備中刪除該應(yīng)用程序?yàn)橹埂?在開(kāi)發(fā)過(guò)程中,每次更新關(guān)聯(lián)文件以立即查看所做的更改時(shí),請(qǐng)從測(cè)試設(shè)備中刪除您的應(yīng)用程序。
自定義URLs
盡管自定義URL方案是可接受的深層鏈接形式,但強(qiáng)烈建議將Universal Link作為最佳實(shí)踐。
自定義URL scheme需要完成如下步驟:
- 定義應(yīng)用程序URL的格式
- 注冊(cè)scheme,以便系統(tǒng)將適當(dāng)?shù)腢RL定向到您的應(yīng)用程序。
- 處理您的應(yīng)用程序收到的URL。
定義應(yīng)用程序URL的格式
eg: myphotoapp:albumname?name=”albumname”
注冊(cè)scheme
image.png
處理您的應(yīng)用程序收到的URL
func application(_ application: UIApplication,
open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:] ) -> Bool {
// Determine who sent the URL.
let sendingAppID = options[.sourceApplication]
print("source application = \(sendingAppID ?? "Unknown")")
// Process the URL.
guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
let albumPath = components.path,
let params = components.queryItems else {
print("Invalid URL or album path missing")
return false
}
if let photoIndex = params.first(where: { $0.name == "index" })?.value {
print("albumPath = \(albumPath)")
print("photoIndex = \(photoIndex)")
return true
} else {
print("Photo index missing")
return false
}
}