版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2021.05.27 星期四 |
前言
Firebase是一家實時后端數據庫創業公司,它能幫助開發者很快的寫出Web端和移動端的應用。自2014年10月Google收購Firebase以來,用戶可以在更方便地使用Firebase的同時,結合Google的云服務。Firebase能讓你的App從零到一。也就是說它可以幫助手機以及網頁應用的開發者輕松構建App。通過Firebase背后負載的框架就可以簡單地開發一個App,無需服務器以及基礎設施。接下來幾篇我們就一起看一下基于Firebase平臺的開發。感興趣的看下面幾篇文章。
1. 基于Firebase平臺開發(一) —— 基于ML Kit的iOS圖片中文字的識別(一)
2. 基于Firebase平臺開發(二) —— 基于ML Kit的iOS圖片中文字的識別(二)
3. 基于Firebase平臺開發(三) —— Firebase基本使用簡介(一)
4. 基于Firebase平臺開發(四) —— Firebase基本使用簡介(二)
5. 基于Firebase平臺開發(五) —— Firebase基本使用簡介(三)
6. 基于Firebase平臺開發(六) —— 基于Firebase Analytics的App使用率的跟蹤(一)
7. 基于Firebase平臺開發(七) —— iOS的A/B Test(一)
8. 基于Firebase平臺開發(八) —— 使用Firebase Cloud Messaging進行Push Notification的發送和接收(一)
9. 基于Firebase平臺開發(九) —— 使用Firebase Cloud Messaging進行Push Notification的發送和接收(二)
開始
首先看下主要內容:
了解如何使用Firebase動態鏈接在iOS上實現深層鏈接。內容來自翻譯。
接著看下寫作環境:
Swift 5, iOS 14, Xcode 12
下面就是正文啦。
用戶每天消耗內容的速度更快,而他們花在導航到您的應用程序上的任何時間都浪費了時間。 使用Deep links,單個URL可以將用戶直接發送到您的應用程序,甚至可以將用戶發送到您應用程序內的特定視圖。
但是,如果他們沒有安裝該應用程序怎么辦? 也考慮到了! 該鏈接提示他們在繼續該過程之前從App Store
安裝該應用程序。
在本教程中,您將構建Raycipe,這是一個簡單的主從視圖應用程序。 在此過程中,您將了解:
- Deep links 和 Universal links。
- 使用
Firebase Dynamic Links
創建和測試deep link
。 - 當用戶未安裝應用程序時處理
deep link
。 - 使用
SwiftUI
以編程方式導航到特定視圖。
注意:您需要付費的
Apple Developer
帳戶來設置Firebase Dynamic Links
。 您可以在此處here獲得一個,也可以繼續閱讀以了解Dynamic Links
如何工作而不實現它們。
打開入門項目。
在起始項目內部,打開Raycipe.xcodeproj
。構建并運行。 您會看到以下內容:
在Xcode中,看一下主要文件:
- recipe.json包含應用程序的數據。
-
AppMain.swift是應用程序的入口點。所有生命周期方法都在這里。這也是您初始化
Firebase
的地方。 - HomeView.swift是應用程序的主視圖,并顯示食譜列表。
- RecipeDetailView.swift顯示有關所選配方的詳細信息。
- DeepLinkHandler.swift是一個幫助程序類,您將使用它來解析URL。
在開始之前,花一點時間來學習deep linking
。
Deep Linking
開發人員使用Deep links
將用戶直接定向到應用程序,而不是網站或商店。更重要的是,他們可以將用戶定向到特定的應用內視圖,從而節省了他們原本要自己查找內容的時間。它可以改善用戶體驗,并可以增加有人安裝您的應用程序的可能性。
Firebase Dynamic Links在Universal Links之上工作。它們特定于iOS 9
引入的Apple
平臺,并在提高性能的同時提供了更高的安全性。
使用Firebase
設置動態鏈接可簡化實現deep linking
的過程。
接下來,您將了解有關Firebase Dynamic Links
更多信息。
1. Firebase Dynamic Links
無論用戶是否安裝了您的應用程序,Firebase Dynamic Links
均可在Android
和iOS
上運行。設置新的dynamic link
時,還可以決定是否僅在特定平臺的瀏覽器中打開dynamic link
。
此外,dynamic links
在安裝過程中不會丟失。 在下圖中,您將看到根據平臺打開dynamic link
的過程。 如果用戶沒有該應用程序,則他們會看到從App Store
安裝該應用程序的提示。 然后,在安裝后,該應用程序可以打開并導航到鏈接的內容。
注意:您不需要網站即可實現
dynamic links
。 但是,如果您想在瀏覽器中打開動態鏈接或鼓勵更多用戶下載您的應用,最好有一個。
Setting Up Firebase
在您的應用中實施Firebase Dynamic Links
之前,您需要設置一個新的new Firebase project
。
如果您已經知道如何設置Firebase
項目和初始化Firebase
,請立即進行操作。 然后跳到Configuring Firebase Project Settings
。
要設置Firebase項目,請遵循下面知道標準集:Firebase Analytics: Getting Started。 從Setting Up Firebase
開始。 繼續Adding Firebase to Xcode
,直到達到Editing Build Settings
。
注意:上面引用的說明將一度要求您從可用庫列表中檢查
FirebaseAnalytics
。 對于本教程,您應該改為檢查FirebaseDynamicLinks
。
完成后,請返回此處并繼續閱讀下面的內容。
Configuring Firebase Project Settings
至此,您已經設置了Firebase
項目。但是,您尚未準備好使用dynamic links
。您需要將App Store ID
和Team ID
添加到項目設置中。
理想情況下,您希望dynamic link
指向App Store
中的應用程序,以便新用戶可以安裝該應用程序,然后繼續導航。
如果您在App Store
中有一個應用程序,請使用您應用程序的App Store ID
。如果您還沒有應用程序,請使用raywenderlich.com
官方應用程序。但是,由于您未導航到自己的應用程序,因此無法看到鏈接在安裝過程中如何存在。
注意:如果您已經知道如何查找
App Store ID
和Team ID
并將其添加到Firebase
項目的設置中,請立即進行操作。然后,隨時跳過接下來的兩節,并繼續Setting Up Domain for Hosting
。如果您不知道如何設置它們,請繼續閱讀下面的內容。
1. Setting Up the App Store ID
必須先找到raywenderlich.com
應用程序的App Store ID
,然后才能使用它。將raywenderlich.com app store
復制并粘貼到您的搜索引擎中。您會看到來自apps.apple.com
的搜索結果:
通過這種方法,您可以在App Store
上找到任何應用程序的App Store ID
。
單擊搜索結果,然后在URL中查找id
參數:
raywenderlich.com
應用程序的App Store ID
為1481444772
。
接下來,打開Firebase
控制臺,然后轉到Project Settings
。 將1481444772
復制并粘貼到App Store ID
字段中:
接下來,您將添加Team ID
。
2. Adding Your Team ID
Dynamic links
需要您的Team ID
才能起作用。 您可以在Apple Developer網站的Membership Details
下找到它:
將其復制并粘貼到App Store ID
下的Firebase
項目設置中。
接下來,您將設置一個host domain
。
Setting Up a Domain for Hosting
在使用Firebase Dynamic Links
之前,您需要為其創建自定義域。
注意:在以下部分中,您將學習如何使用擁有的域上的自定義子域來設置
Firebase Dynamic Links
。它是可選的,如果您不擁有域,則可以跳至Creating a Free Firebase Custom Domain
。
1. Setting Up Firebase Hosting
在將自定義域用于dynamic links
之前,需要確保該域指向Firebase Hosting
。如果您有要與dynamic links
一起使用的域,并且該域指向其他host
,則必須將其移至Firebase Hosting
。如果您不想這樣做,則可以創建由Firebase
托管的子域,該子域可用于動態鏈接。
注意:在某些情況下,例如,當您已經為
dynamic links
設置了自定義域并想要添加另一個域時,或者當另一個站點托管您的host
時,您必須手動設置域。為此,請按照Firebase
文檔中有關Setting up a custom domain manually的說明進行操作。隨時跳過以下部分,并繼續在Adding Associated Domains in Xcode
。
打開Firebase
控制臺。在Hosting
下,單擊Get started
。
您會看到一組說明,以設置Firebase Hosting
。
您目前無需完成指示的步驟,因為它們可以指導您設置您的域。 幾次單擊Next
,然后單擊Continue to console
。
您會看到一個Firebase Hosting dashboard
,其中包含兩個自定義的Firebase
設置域:
您可以使用這些域來托管您的內容。 但是,您將學習如何設置自己的自定義子域,然后將其用于dynamic links
。
2. Creating a Firebase-Hosted Subdomain
在左側面板中,選擇Dynamic Links
,然后單擊Get started
。 首先,創建一個自定義子域:
選擇您的域唯一的內容。
單擊Continue
以添加可選的路徑前綴:
單擊Continue
,將您的子域部署到Firebase Hosting
。
您必須驗證要使用的域的所有權。 為此,請在DNS settings
中添加具有唯一字符串值的TXT record
:
此步驟是必需的。 您的子域在完成之前不會上線。
注意:每個域名注冊商都有不同的過程來在
DNS
設置中添加TXT
記錄。 如果不確定如何添加,請與您的提供商聯系或查看官方文檔。
這些更改最多可能需要24
小時才能在您的域中展示。 一旦Firebase
成功驗證了您的域所有權后,您就可以繼續進行設置。
驗證域后,從頭開始為您的子域重復設置。 單擊Verify
。 然后繼續進行設置。
最后,通過訪問DNS
提供商或注冊商將A record
添加到您的域中:
您可以按照添加TXT
記錄的相同方式添加一個記錄。
您的DNS
記錄將如下所示:
不同的提供程序使用不同的命名約定,因此您的命名約定可能會有所不同。 如果不確定,請咨詢您的DNS
提供商或閱讀其官方文檔。
這些更改最多可能需要24
小時才能在您的域中傳播。
要查看該過程是否成功,請為您的項目打開Firebase Hosting
。 您會在列表中看到您的自定義子域,并在其旁邊看到Connected:
如果您想為iOS應用上的Firebase dynamic links
使用自定義域或子域,則設置中還需要執行其他步驟。
打開Xcode
。 在Info.plist
中,創建一個名為FirebaseDynamicLinksCustomDomains
的密鑰。 將其設置為應用程序的Dynamic Links URL
前綴:
或者,您可以使用免費的自定義Firebase
域。
3. Creating a Free Firebase Domain
Firebase
的優點是您不必擁有域。 Firebase
提供了一個已經與您的應用程序相關聯的免費自定義域,您可以將其用于dynamic links
。
您可以通過給自己喜歡的任何名稱并將page.link
附加到末尾來創建自己的Firebase
自定義域。 這是dynamic links
的自定義域。
打開Firebase console
。 在Dynamic Links
下,單擊Get started
。
域在全球范圍內是唯一的,因此您不能使用圖片中所示的相同域。 但是,您應該在可以使用的下拉列表中看到Google
提供的以page.link
結尾的域。
指定域后,請單擊Continue
,然后單擊Finish
。 您會在Firebase
控制臺中看到您的域。
請務必將其寫下來,因為稍后您將需要它。
要完成此配置,請將Associated Domains
添加到您的Xcode
項目中。
4. Adding Associated Domains in Xcode
Associated Domains為universal links
提供了基礎。
當您想在應用程序中使用deep links
時,必須在托管站點上托管一個名為apple-app-site-association
的文件。 這是必不可少的步驟,可在您的域和您的應用之間建立關聯。
如果您將Firebase動態鏈接用于深層鏈接,則當您成功創建Firebase
上托管的域時,已經為您設置了apple-app-site-association
。
在Xcode
中的Signing & Capabilities
下,單擊+ Capability
。 添加Associated Domains
:
單擊+
,然后以以下格式復制并粘貼您的域:applinks:[your domain]
。
現在,您已經添加了關聯的域,是時候在Terminal
中測試deep link
了。
5. Testing Your Deep Link in Terminal
要在不使用物理設備的情況下測試deep link
,需要同時使用Simulator
和Terminal
。
在Simulator
中構建并運行您的應用。 一旦運行,請在模擬器中將其關閉,以查看主屏幕。 然后,打開終端并將其放置在可以同時看到終端和模擬器的地方。
將以下命令復制并粘貼到終端窗口中,將[your domain]
替換為您在Firebase
中為dynamic link
創建的域:
xcrun simctl openurl booted [your domain]
按回車鍵,您的應用程序將立即打開!
現在是時候構建Firebase dynamic link
了。
Building Firebase Dynamic Links
您可以通過四種方式創建Firebase dynamic links
:
- 在
Firebase
控制臺中 - 以編程方式使用
Dynamic Link Builder API
- 使用
REST API
- 手動
如果您要創建促銷鏈接以在社交媒體上共享,則使用Firebase console創建dynamic links
非常有用。 該過程很簡單,Firebase
會逐步指導您完成該過程:
使用iOS
和Android
上的Builder API
以編程方式創建鏈接對于用戶與用戶之間的共享或在需要dynamic link
的任何情況下最有用。
另一方面,如果您要在沒有Builder API
的平臺上創建鏈接,那么使用REST API是更好的選擇。
最后,如果您不需要跟蹤點擊數據并且不介意長鏈接,則可以使用URL參數手動manually構建鏈接。 唯一的好處是避免了額外的網絡往返。
在本教程中,您將使用Dynamic Link Builder API創建動態鏈接。
您將首先創建URL。
1. Defining the URL
如前所述,您無需為本教程建立網站。 相反,您將使用raywenderlich.com
官方網站。 如果您已經建立了一個網站并擁有一個自定義域,請在本教程的其余部分中隨意使用它。
在Xcode
中,打開RecipeDetailView.swift
。 將以下內容添加到文件的頂部:
import Firebase
接下來,向下滾動到文件末尾。 在createDynamicLink()
內部,將// TODO 1
替換為:
var components = URLComponents()
components.scheme = "https"
components.host = "www.raywenderlich.com"
components.path = "/about"
URLComponents
從其組成部分構造和解析URL。 它是Foundation
框架的一部分。
在這里,您使用/ about
路徑以raywenderlich.com
的“About”
頁面為例。 理想情況下,使用此應用程序,頁面會顯示食譜,因此,如果您使用自己的網站,請隨意使用托管食譜的頁面路徑。
接下來,將// TODO 2
替換為:
let itemIDQueryItem = URLQueryItem(name: "recipeID", value: recipe.recipeID)
components.queryItems = [itemIDQueryItem]
要在網站或應用中查找特定食譜,您需要使用所需的recipeID
進行指定。
現在,將// TODO 3
替換為:
guard let linkParameter = components.url else { return }
print("I am sharing \(linkParameter.absoluteString)")
在這里,您使用URLComponents
對象創建URL
。
構建并運行。 點擊食譜卡,然后單擊Share
。 現在,在您的Xcode
控制臺中,查找print
語句:
接下來,您將創建一個dynamic link
。
2. Using Dynamic Link Builder API
您將使用Dynamic Link Builder API
創建Dynamic Links
。
仍在RecipeDetailView.swift
中,將// TODO 4
替換為:
let domain = "https://rayciperw.page.link"
guard let linkBuilder = DynamicLinkComponents
.init(link: linkParameter, domainURIPrefix: domain) else {
return
}
這將定義dynamic link
組件對象,該對象具有您先前定義的URL
和URI
前綴,這是您在Firebase
控制臺中的dynamic links: https://[your domain]
下定義的對象。
不要忘記將https://rayciperw.page.link
替換為您自己的URL。
接下來,將// TODO 5
替換為:
// 1
if let myBundleId = Bundle.main.bundleIdentifier {
linkBuilder.iOSParameters = DynamicLinkIOSParameters(bundleID: myBundleId)
}
// 2
linkBuilder.iOSParameters?.appStoreID = "1481444772"
// 3
linkBuilder.socialMetaTagParameters = DynamicLinkSocialMetaTagParameters()
linkBuilder.socialMetaTagParameters?.title = "\(recipe.name) from Raycipe"
linkBuilder.socialMetaTagParameters?.descriptionText = recipe.description
linkBuilder.socialMetaTagParameters?.imageURL = URL(string: """
https://pbs.twimg.com/profile_images/\
1381909139345969153/tkgxJB3i_400x400.jpg
""")!
詳細分析:
- 1) 您定義一個
DynamicLinkIOSParameters
對象,并以編程方式為其分配應用程序bundle ID
的值。 - 2) 該鏈接需要知道將未安裝該應用程序的用戶發送到哪里。 為此,您使用
appStoreID
。 如果您在App Store
上擁有自己的應用程序,請對其進行更改以匹配您的應用程序ID。 - 3) 然后,您可以使用
socialMetaTagParameters
定義在社交媒體帖子中共享時鏈接的外觀。 您可以從URL
添加標題,描述和圖像。 如果您的網站上有食譜,則可以為每個食譜分配一個適當的圖片網址。 在這種情況下,您使用的是raywenderlich.com
徽標。
您可以將幾個可選參數添加到dynamic link
中。 要了解有關這些參數的更多信息,請參閱Firebase Documentation。
最后,將// TODO 6
替換為:
guard let longURL = linkBuilder.url else { return }
print("The long dynamic link is \(longURL.absoluteString)")
在這里,您可以檢索所需的dynamic link
!
構建并運行。 點擊食譜卡,然后點擊Share
。 檢查您的Xcode
控制臺輸出并查找輸出:
您可以按原樣使用此鏈接,因為它是功能性的dynamic link
。 但是,它很長,共享時看起來也不好。
Firebase
為您提供了一種縮短它并使它看起來更具吸引力的方法。
但是,為了縮短它,您需要對Firebase
進行另一個網絡調用。 您需要將長dynamic link
發送到網絡服務,該鏈接將采用該長鏈接并返回縮短的版本。
如果您的用戶的網絡狀況較差,則縮短服務可能會花費太長時間。 此時,您的用戶可能會放棄并完全卸載您的應用程序。 請記住,dynamic links
的全部目的是節省用戶時間,而不是讓他們感到沮喪。
由您決定是喜歡長動態鏈接還是要縮短它。
接下來,您將學習如何縮短它。
3. Shortening the URL
要縮短長動態鏈接,請將其傳遞給.shorten(completion :)
。
仍在RecipeDetailView.swift
中,在您添加的最后一個代碼下面添加以下內容:
linkBuilder.shorten { url, warnings, error in
if let error = error {
print("Oh no! Got an error! \(error)")
return
}
if let warnings = warnings {
for warning in warnings {
print("Warning: \(warning)")
}
}
guard let url = url else { return }
print("I have a short url to share! \(url.absoluteString)")
shareItem(with: url)
}
閉包很簡單。 您需要檢查是否有任何錯誤或警告,并確保獲得該URL
。 打印最終URL
,以便您可以在模擬器中測試您的應用。
在閉包的末尾,您調用shareItem(with :)
,這是一個已經定義的幫助程序方法。 它打開一個標準的共享表。
您的應用程序現在具有共享dynamic links
和重定向用戶(如果他們沒有該應用程序)的所有功能。
構建并運行。 點擊Share
,您將看到一個共享表。
您可以在共享表單中看到您共享的鏈接的外觀,其中包含您定義的所有可選參數:
在您的Xcode
控制臺中,查找print
語句以查看最終的縮短的動態鏈接的外觀:
現在是時候查看您的應用程序了。
4. Seeing Your App in Action
要查看整個工作流程,請將您的模擬器和終端并排放置。 確保您的模擬器顯示主屏幕且未運行您的應用程序。
將以下命令復制并粘貼到終端窗口中,將[your shortened dynamic link]
替換為Xcode
控制臺中的短動態鏈接:
xcrun simctl openurl booted [your shortened dynamic link]
按回車鍵,然后看到該應用已打開:
要查看未安裝應用程序時發生的情況,請從模擬器中刪除Raycipe
。 長按Raycipe
,然后選擇Delete App
。
請遵循相同的說明,并使用相同的簡短動態鏈接在終端窗口中再次運行命令:
您會看到dynamic link
用來指導用戶安裝應用的網頁。 如果單擊OPEN
,它將帶您到App Store
。 不幸的是,該功能在模擬器上不可用,但是您可以在真實設備上嘗試使用。
如果您沒有付費的Apple Developer
帳戶,或者無法在物理設備上運行您的應用,請參考以下示例,該鏈接在您共享或在Messages
中接收鏈接時的外觀:
接下來,您將解釋您的dynamic link
。
Interpreting Your Dynamic Link
有趣的來了! 您將把您的用戶定向到您應用中的特定頁面。 當用戶與食譜共享鏈接時,如果用戶在手機上安裝了該應用程序,則接收該鏈接的任何人都將看到同一食譜的詳細視圖。
聽起來像魔術,但事實并非如此。 您只需要了解所有秘密成分。
首先,請處理您應用中的URL
。
1. Handling the Incoming URL
在SwiftUI
中使用新的應用程序生命周期,通過在場景中調用.onOpenURL(perform :)
處理傳入的URL
。 由于您只有一個場景,因此可以將其附加到該場景。 但是,如果您有更多的場景,則應使用最頂層的場景,因為那是導航開始的地方。
打開AppMain.swift
。 在// Call onOpenURL
下方,添加:
// 1
.onOpenURL { url in
print("Incoming URL parameter is: \(url)")
// 2
let linkHandled = DynamicLinks.dynamicLinks()
.handleUniversalLink(url) { dynamicLink, error in
guard error == nil else {
fatalError("Error handling the incoming dynamic link.")
}
// 3
if let dynamicLink = dynamicLink {
// Handle Dynamic Link
self.handleDynamicLink(dynamicLink)
}
}
// 4
if linkHandled {
print("Link Handled")
} else {
print("No Link Handled")
}
}
這是正在發生的事情:
- 1)
.onOpenURL(perform :)
接收傳入的URL
。 - 2)
handleUniversalLink(_:completion :)
將URL
解析為DynamicLink
。 它進行網絡調用以將短動態鏈接轉換為完整動態鏈接并提取URL
參數。 如果失敗,則返回錯誤。 - 3) 您可以通過調用尚未定義的方法來處理檢索到的任何
dynamic link
,接下來將編寫該方法。 - 4) 最后,您報告是否處理了該鏈接。 如果您正在使用其他
universal links
,則可以在其中進行處理。
要解決編譯器錯誤,請在// Handle incoming dynamic link
下添加以下內容:
func handleDynamicLink(_ dynamicLink: DynamicLink) {
}
您將在后面的部分中進一步充實它。
構建并運行。 選擇一個食譜,然后點擊Share
。
從Xcode
控制臺復制短URL,然后在終端窗口中運行以下命令:
xcrun simctl openurl booted [your short URL]
返回Xcode并查看控制臺輸出:
傳入URL
和共享的dynamic link URL
是相同的。
接下來,您將解析URL
參數并提取recipeID
。
2. Parsing the URL Components
打開DeepLinkHandler.swift
。 在// Parse url
下面添加以下內容:
func parseComponents(from url: URL) -> DeepLink? {
// 1
guard url.scheme == "https" else {
return nil
}
// 2
guard url.pathComponents.contains("about") else {
return .home
}
// 3
guard let query = url.query else {
return nil
}
// 4
let components = query.split(separator: ",").flatMap {
$0.split(separator: "=")
}
// 5
guard let idIndex = components.firstIndex(of: Substring("recipeID")) else {
return nil
}
// 6
guard idIndex + 1 < components.count else {
return nil
}
// 7
return .details(recipeID: String(components[idIndex + 1]))
}
在這里,您:
- 1) 確保
URL
具有正確的scheme
。與您一開始所定義的相同。 - 2) 檢查該
URL
是否包含about
路徑component
,或者如果您擁有自己的網站,則為dynamic link
使用該路徑。如果不是,它將僅打開應用程序并顯示主視圖,因此它將返回.home
。 - 3) 確保傳入的
URL
有一個查詢字符串,比如recipeID=002
的部分。 - 4) 現在,您將
query string
拆分為其各個components
。使用flatMap(_ :)
,將每個component
分開,用=
分隔,然后創建一個元素數組。看起來像這樣:[“ recipeID”,“ 002”]
。 - 5) 由于URL可以具有更多查詢參數,因此您需要找到
recipeID
的index
并將其分配給idIndex
。 - 6)
components
數組有兩個元素,因此您的recipeID
的索引為1
。通過確保idIndex + 1
小于components
數(兩個)來檢查它是否存在。 - 7) 最后,將
recipeID
值分配給.details(recipeID :)
并將其返回。
您已經解析了URL
參數并提取了recipeID
的值,但是您的應用仍然不知道該如何處理。那是因為您需要確保需要此值的視圖將其接收。
接下來,您將使用環境值來執行此操作。
3. Using Environment Values
了解您應用的狀態通常會很有幫助。例如,也許您想在應用程序激活時獲取新數據,或者在應用程序轉換到后臺后刪除所有緩存的數據。
SwiftUI
跟蹤環境中場景的狀態。您可以使用@Environment
屬性包裝器使其在應用程序中的任何地方都可用。
您將使用這種方法并為deep links
創建自己的EnvironmentKey
。如果要了解有關Environment Values
的更多信息,請查看有關該主題的Apple's Documentation。
在Helpers
文件夾中,創建一個名為DeepLinkKey.swift
的新Swift
文件。
將import Foundation
替換為:
import SwiftUI
然后,添加:
struct DeepLinkKey: EnvironmentKey {
static var defaultValue: DeepLinkHandler.DeepLink? {
return nil
}
}
在這里,您聲明一種新的環境密鑰類型,并將其必需的defaultValue
屬性指定為DeepLink?
類型。
接下來,在文件底部添加以下擴展名:
// MARK: - Define a new environment value property
extension EnvironmentValues {
var deepLink: DeepLinkHandler.DeepLink? {
get {
self[DeepLinkKey]
}
set {
self[DeepLinkKey] = newValue
}
}
}
在這里,您可以通過使用新屬性擴展EnvironmentValues
來創建自定義環境值。
現在,打開AppMain.swift
,并在// Define deepLink
下面添加:
@State var deepLink: DeepLinkHandler.DeepLink?
然后,在// Add environment modifier
下面,添加:
.environment(\.deepLink, deepLink)
在這里,您可以通過在HomeView()
上調用.environment(_:_ :)
來設置視圖及其所有子視圖的環境值。
既然您定義了自定義環境密鑰,就可以結束對dynamic link
的處理了。
4. Handling the Incoming Dynamic Link
打開AppMain.swift
,然后在handleDynamicLink(_ :)
內添加以下內容:
guard let url = dynamicLink.url else { return }
print("Your incoming link parameter is \(url.absoluteString)")
// 1
guard
dynamicLink.matchType == .unique ||
dynamicLink.matchType == .default
else {
return
}
// 2
let deepLinkHandler = DeepLinkHandler()
guard let deepLink = deepLinkHandler.parseComponents(from: url) else {
return
}
self.deepLink = deepLink
print("Deep link: \(deepLink)")
// 3
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
self.deepLink = nil
}
以下是代碼細分:
- 1) 每個
dynamic link
都有一個matchType
,該類型顯示您對用戶單擊該dynamic link
庫的信心。 它有四種類型:unique, default, weak and none
。 如果您在鏈接中共享的數據屬于私人性質,則需要確保匹配類型是unique
。 否則,建議您不要顯示可從該鏈接中提取的任何個人信息,因為該鏈接以前可能已被使用過。 - 2) 您調用
parseComponents(from :)
并將URL
作為參數傳遞。 如果解析成功,則將返回的值分配給您的deepLink
環境值。 - 3) 由于它們在您的應用程序內存中仍然可用,因此您需要重置環境值。 如果用戶再次單擊相同的鏈接,則不會發生任何事情,因為環境值未更改。
構建并運行。 選擇一個食譜,然后點擊Share
。
從Xcode控制臺復制短URL,然后在終端窗口中運行以下命令:
xcrun simctl openurl booted [your short URL]
返回Xcode
并查看控制臺輸出:
deepLink
環境屬性的值是details(recipeID:“ 002”)
。
剩下要做的就是使用此值導航到應用程序中的特定詳細視圖。
5. Handling Navigation in Your App
打開HomeView.swift
。 在// Define environment property
下面/添加:
@Environment(\.deepLink) var deepLink
要從HomeView()
或其任何子級內部讀取環境值,請定義環境屬性包裝器。
接下來,在// Define navigation
下面添加以下內容:
// 1
.onChange(of: deepLink) { deepLink in
guard let deepLink = deepLink else { return }
switch deepLink {
case .details(let recipeID):
// 2
if let index = recipes.firstIndex(where: {
$0.recipeID == recipeID
}) {
// 3
proxy.scrollTo(index, anchor: .bottom)
// 4
cellSelected = index
}
case .home:
break
}
}
以下是代碼細分:
- 1) 您將
onChange(of:perform :)
添加到視圖中。 每當deepLink
環境值更改時,它都會觸發一個操作。 - 2) 接下來,找到具有指定
recipeID
的配方索引index
。 - 3)
ScrollViewReader
是通過使用代理來提供程序化滾動的視圖。 您可以使用代理的scrollTo(_:anchor :)
進行滾動。 它掃描滾動視圖,直到找到具有指定索引的第一個子視圖。 - 4) 最后,將
index
值分配給cellSelected
。 當它收到一個新的索引值時,它會在NavigationLink
的幫助下自動觸發導航到特定的詳細視圖。
構建并運行。 選擇一個配方,點擊Share
,然后使用Simulator and Terminal
打開您的dynamic link
。
現在,您的應用程序可以將用戶引導至特定的配方詳細視圖:
您可以使用LinkPresentation
框架使共享的鏈接更加豐富和友好。 如果您想學習方法,請查看 Visually Rich Links Tutorial for iOS: Image Thumbnails。
請務必查看 Firebase Tutorial: Getting Started,以了解Firebase
如何為您的應用程序增能。 如果您不知道從哪里開始,那么Firebase Official Documentation就是一個很好的起點。
后記
本篇主要講述了
Firebase Dynamic Links
的簡單使用,感興趣的給個贊或者關注~~~