版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.08.25 |
前言
大家一定遇到過很多的情況:比如說點擊一個網頁的webview上的鏈接或者點擊一個備忘錄中的連接,就會直接跳轉到自己的App里面,這其中一個實現方法就是使用:Universal Links。接下來幾篇我們就一起看一下Universal Links的使用。
簡介
寫作環境:Swift 3, iOS 10, Xcode 8。
你有一個與iOS應用共享內容的網站嗎? 從iOS 9開始,您可以使用通用鏈接連接它們,這意味著用戶現在可以觸摸iPhone上的HTTP鏈接并直接發送到您的應用程序!
在本教程中,您將學習如何將iOS應用程序鏈接到Heroku網站。 應用程序和網站都提供單板計算機的參考資料。
本教程假設您對Swift和iOS開發有基本的了解。 如果您不熟悉這些內容,請首先閱讀關于Swift和iOS開發的其他一些教程。 以前使用Heroku和Web開發的經驗將是有益的,但并不是嚴格要求的。
最后,您必須擁有付費Apple開發者帳戶。 不幸的是,免費帳戶將無法使用。
下載我們的示例工程,Build并運行,你會看到主視圖控制器 - ComputersController
。
該應用程序展示了市場上一些最受歡迎的單板計算機。 觸摸其中一行以切換到詳細信息視圖控制器ComputerDetailController
。 您可以在此處查看特定于產品的信息,包括網站,供應商和定價。
還創建了具有類似信息的基本網站。 在這里查看starter website here。
不要擔心Heroku
部分:這只是您訪問演示網站的快速方法。雖然本教程不要求您,但您可以選擇將網站部署到您自己的Heroku
帳戶。如果您想這樣做,請按照此處的說明操作。
現在您已經看過應用程序和網站,現在是時候深入了解代碼來連接它們。最終目標:每當用戶點擊iOS設備上的任何網站鏈接時 - 例如 https://rw-universal-links-starter.herokuapp.com/arduino.html - 它將由應用打開,而不是蘋果瀏覽器Safari
。作為最后一點,應用程序甚至可以直接導航到特定的計算機細節控制器。
要做到這一點,你需要做三件事:
- 1)通知網站的應用程序。
- 2)通知應用程序的網站。
- 3)無論何時點擊鏈接,都可以在應用內處理導航。
創建通用鏈接有幾個要求。首先,您必須對鏈接網站具有write access
,該網站必須使用HTTPS,并且您必須能夠將文件上傳到該網站。其次,您必須擁有關聯的應用程序,因此您可以編輯其配置文件capabilities
以注冊網站并能夠將其部署到App Store
。
由于這些原因,您將無法測試教程應用程序。但是,您仍然會通過這個過程來了解它是如何完成的。
Configuring the App - 配置App
您首先需要配置應用程序以處理通用鏈接。 從Starter
文件夾中打開UniversalLinks.xcodeproj
并執行以下操作:
- 1)選擇
UniversalLinks
項目。 - 2)選擇
UniversalLinks
目標。 - 3)選擇
Capabilities
選項卡。 - 4)滾動并啟用
Associated Domains
。
您可能會收到Select a Development Team to Use for Provisioning
的提示。選擇您所在的任何付費Apple開發人員團隊,然后按Choose
繼續。
如果您看到Add an Apple ID Account
的提示,則表示您當前未登錄任何帳戶。在這種情況下,請按Add
按鈕并登錄您所屬的付費Apple開發人員團隊。
這是一個付費帳戶很重要。當我在測試中嘗試使用免費帳戶時,Xcode一直崩潰,這似乎是一個Xcode錯誤。
您還會看到一條錯誤消息,指出An App ID with identifier ‘com.razeware.UniversalLinks’ is not available
。這是因為原始教程應用已經采用了應用標識符。
在您自己的應用中,請確保您的應用標識符是唯一的(遵循反向域名表示法)。但是,對于本教程的應用程序,可以忽略此消息。
接下來,按+并添加以下域:applinks:rw-universal-links-final.herokuapp.com
請務必添加applinks
前綴。您現在應該看到以下內容:
第一步就完成了! 該應用程序現在知道該網站的URL。 接下來,您將配置網站。
Configuring the Website - 配置Website
現在你需要讓網站上的“big secret”
。為此,創建一個apple-app-site-association
文件。 這個文件對于iOS世界來說并不陌生:它與iOS 8中用于Web credentials
和Handoff
的文件相同。 格式與JSON文件的格式匹配,但它不能具有.json
擴展名。 不應該使用擴展,為了保持調試的健全性,請仔細檢查文件名是否完全匹配!
創建apple-app-site-association
文件并添加以下內容:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "KFCNEC27GU.com.razeware.UniveralLinksTutorial",
"paths": ["*"]
}
]
}
}
applinks
標簽確定哪些應用與網站相關聯。 將apps值保留為空數組。 details
標記內部是一個字典數組,用于鏈接appID
和URL
路徑。 為簡單起見,“*”
通配符用于將所有此網站的鏈接與UniversalLinks
應用相關聯。 此外,路徑值可以限制為特定文件夾或文件名。
appID
包含您的team ID
以及應用的bundle ID
。 上面列出的團隊ID屬于Ray Wenderlich
團隊,但您需要為自己的帳戶使用該標識符。
Apple在創建Apple開發人員帳戶時為您分配了一個team ID
。 它可以在Apple developer center找到。 登錄網站,單擊Your Account
選項卡,然后向下滾動到Developer Account Summary
部分。 你會在那里找到你的team ID
。
您可以通過Xcode
的Targets \ UniversalLinks \ General
標簽找到該應用的bundle ID
:
現在apple-app-site-association
已經完成,是時候將它上傳到Web服務器了。
同樣,您必須對網站具有“write access”
才能執行此操作。 為了本教程的目的,您可以參考已完成的網站finished website,該網站已包含此文件。
如果您想確保它在那里,請打開http://rw-universal-links-final.herokuapp.com/apple-app-site-association。 您會看到它與上面顯示的信息相符。
大棒了! 該應用程序了解該網站,該網站了解UniversalLinks
應用程序。 現在是最后一步的時候了:添加應用程序邏輯來處理通用鏈接的時候。
Handling Universal Links - 處理通用鏈接
現在應用程序和網站正式相互了知道彼此了,所有應用程序需求都是代碼來處理調用時的鏈接。
打開AppDelegate.swift
并添加以下helper方法:
func presentDetailViewController(_ computer: Computer) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let detailVC = storyboard.instantiateViewController(withIdentifier: "NavigationController")
as! ComputerDetailController
detailVC.item = computer
let navigationVC = storyboard.instantiateViewController(withIdentifier: "DetailController")
as! UINavigationController
navigationVC.modalPresentationStyle = .formSheet
navigationVC.pushViewController(detailVC, animated: true)
}
此方法打開ComputerDetailController
并顯示Computer
參數的信息。 這為您提供了一種導航到特定單板計算機的簡潔方法。 接下來你將使用這種方法。
在上一個方法之后,添加以下代理方法:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
// 1
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL,
let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
return false
}
// 2
if let computer = ItemHandler.sharedInstance.items.filter({ $0.path == components.path}).first {
self.presentDetailViewController(computer)
return true
}
// 3
let webpageUrl = URL(string: "http://rw-universal-links-final.herokuapp.com")!
application.openURL(webpageUrl)
return false
}
只要點擊與應用程序相關的通用鏈接(universal link)
,就會調用此方法。 以下是每個步驟的作用:
- 1)首先,驗證傳入的
userActivity
是否具有預期的特征。 最終,您希望獲取活動的path
部分。 否則,返回false
表示應用程序無法處理活動。 - 2)使用該
path
,您將查找與其匹配的已知計算機。 如果找到一個,則為其顯示詳細視圖控制器并返回true。 - 3)如果找不到與路徑匹配的計算機,則指示應用程序打開URL,該URL將使用默認的系統應用程序 - 很可能是Safari。 您還在此處返回false,表示該應用無法處理用戶活動。
Testing the Links - 測試鏈接
如上所述,沒有很好的方法來測試通用鏈接是否在教程應用程序中工作,但了解在您自己的應用程序中實現通用鏈接時的預期結果非常重要。
如果你已經在自己的應用程序中實現了這一點,你就可以給自己發送一個鏈接(例如https://rw-universal-links-final.herokuapp.com/arduino.html
),點擊它,然后驗證顯示正確的頁面。
請記住,也可以從其他位置觸發通用鏈接,例如UIWebView
,WKWebView
,SFSafariViewController
,Notes
或直接在Safari
中。
到這里,有關universal link的內容就結束了,
您可以直接從Apple’s documentation中找到其他參考資料。
要在您自己的網站上測試您的通用鏈接的實現,您可以使用此工具this tool或Apple自己的鏈接驗證器Apple’s own link validator,這兩者都可以指出您的設置中可能存在的問題。
后記
本篇主要講述了基本配置和使用示例,感興趣的給個贊或者關注~~~