基于Firebase平臺開發(fā)(十) —— Firebase Dynamic Links的簡單使用(一)

版本記錄

版本號 時間
V1.0 2021.05.27 星期四

前言

Firebase是一家實時后端數(shù)據(jù)庫創(chuàng)業(yè)公司,它能幫助開發(fā)者很快的寫出Web端和移動端的應(yīng)用。自2014年10月Google收購Firebase以來,用戶可以在更方便地使用Firebase的同時,結(jié)合Google的云服務(wù)。Firebase能讓你的App從零到一。也就是說它可以幫助手機以及網(wǎng)頁應(yīng)用的開發(fā)者輕松構(gòu)建App。通過Firebase背后負(fù)載的框架就可以簡單地開發(fā)一個App,無需服務(wù)器以及基礎(chǔ)設(shè)施。接下來幾篇我們就一起看一下基于Firebase平臺的開發(fā)。感興趣的看下面幾篇文章。
1. 基于Firebase平臺開發(fā)(一) —— 基于ML Kit的iOS圖片中文字的識別(一)
2. 基于Firebase平臺開發(fā)(二) —— 基于ML Kit的iOS圖片中文字的識別(二)
3. 基于Firebase平臺開發(fā)(三) —— Firebase基本使用簡介(一)
4. 基于Firebase平臺開發(fā)(四) —— Firebase基本使用簡介(二)
5. 基于Firebase平臺開發(fā)(五) —— Firebase基本使用簡介(三)
6. 基于Firebase平臺開發(fā)(六) —— 基于Firebase Analytics的App使用率的跟蹤(一)
7. 基于Firebase平臺開發(fā)(七) —— iOS的A/B Test(一)
8. 基于Firebase平臺開發(fā)(八) —— 使用Firebase Cloud Messaging進行Push Notification的發(fā)送和接收(一)
9. 基于Firebase平臺開發(fā)(九) —— 使用Firebase Cloud Messaging進行Push Notification的發(fā)送和接收(二)

開始

首先看下主要內(nèi)容:

了解如何使用Firebase動態(tài)鏈接在iOS上實現(xiàn)深層鏈接。內(nèi)容來自翻譯。

接著看下寫作環(huán)境:

Swift 5, iOS 14, Xcode 12

下面就是正文啦。

用戶每天消耗內(nèi)容的速度更快,而他們花在導(dǎo)航到您的應(yīng)用程序上的任何時間都浪費了時間。 使用Deep links,單個URL可以將用戶直接發(fā)送到您的應(yīng)用程序,甚至可以將用戶發(fā)送到您應(yīng)用程序內(nèi)的特定視圖。

但是,如果他們沒有安裝該應(yīng)用程序怎么辦? 也考慮到了! 該鏈接提示他們在繼續(xù)該過程之前從App Store安裝該應(yīng)用程序。

在本教程中,您將構(gòu)建Raycipe,這是一個簡單的主從視圖應(yīng)用程序。 在此過程中,您將了解:

  • Deep linksUniversal links
  • 使用Firebase Dynamic Links創(chuàng)建和測試deep link。
  • 當(dāng)用戶未安裝應(yīng)用程序時處理deep link
  • 使用SwiftUI以編程方式導(dǎo)航到特定視圖。

注意:您需要付費的Apple Developer帳戶來設(shè)置Firebase Dynamic Links。 您可以在此處here獲得一個,也可以繼續(xù)閱讀以了解Dynamic Links如何工作而不實現(xiàn)它們。

打開入門項目。

在起始項目內(nèi)部,打開Raycipe.xcodeproj。構(gòu)建并運行。 您會看到以下內(nèi)容:

在Xcode中,看一下主要文件:

  • recipe.json包含應(yīng)用程序的數(shù)據(jù)。
  • AppMain.swift是應(yīng)用程序的入口點。所有生命周期方法都在這里。這也是您初始化Firebase的地方。
  • HomeView.swift是應(yīng)用程序的主視圖,并顯示食譜列表。
  • RecipeDetailView.swift顯示有關(guān)所選配方的詳細(xì)信息。
  • DeepLinkHandler.swift是一個幫助程序類,您將使用它來解析URL。

在開始之前,花一點時間來學(xué)習(xí)deep linking。


Deep Linking

開發(fā)人員使用Deep links將用戶直接定向到應(yīng)用程序,而不是網(wǎng)站或商店。更重要的是,他們可以將用戶定向到特定的應(yīng)用內(nèi)視圖,從而節(jié)省了他們原本要自己查找內(nèi)容的時間。它可以改善用戶體驗,并可以增加有人安裝您的應(yīng)用程序的可能性。

Firebase Dynamic LinksUniversal Links之上工作。它們特定于iOS 9引入的Apple平臺,并在提高性能的同時提供了更高的安全性。

使用Firebase設(shè)置動態(tài)鏈接可簡化實現(xiàn)deep linking的過程。

接下來,您將了解有關(guān)Firebase Dynamic Links更多信息。

1. Firebase Dynamic Links

無論用戶是否安裝了您的應(yīng)用程序,Firebase Dynamic Links均可在AndroidiOS上運行。設(shè)置新的dynamic link時,還可以決定是否僅在特定平臺的瀏覽器中打開dynamic link。

此外,dynamic links在安裝過程中不會丟失。 在下圖中,您將看到根據(jù)平臺打開dynamic link的過程。 如果用戶沒有該應(yīng)用程序,則他們會看到從App Store安裝該應(yīng)用程序的提示。 然后,在安裝后,該應(yīng)用程序可以打開并導(dǎo)航到鏈接的內(nèi)容。

注意:您不需要網(wǎng)站即可實現(xiàn)dynamic links。 但是,如果您想在瀏覽器中打開動態(tài)鏈接或鼓勵更多用戶下載您的應(yīng)用,最好有一個。


Setting Up Firebase

在您的應(yīng)用中實施Firebase Dynamic Links之前,您需要設(shè)置一個新的new Firebase project

如果您已經(jīng)知道如何設(shè)置Firebase項目和初始化Firebase,請立即進行操作。 然后跳到Configuring Firebase Project Settings。

要設(shè)置Firebase項目,請遵循下面知道標(biāo)準(zhǔn)集:Firebase Analytics: Getting Started。 從Setting Up Firebase開始。 繼續(xù)Adding Firebase to Xcode,直到達到Editing Build Settings。

注意:上面引用的說明將一度要求您從可用庫列表中檢查FirebaseAnalytics。 對于本教程,您應(yīng)該改為檢查FirebaseDynamicLinks

完成后,請返回此處并繼續(xù)閱讀下面的內(nèi)容。


Configuring Firebase Project Settings

至此,您已經(jīng)設(shè)置了Firebase項目。但是,您尚未準(zhǔn)備好使用dynamic links。您需要將App Store IDTeam ID添加到項目設(shè)置中。

理想情況下,您希望dynamic link指向App Store中的應(yīng)用程序,以便新用戶可以安裝該應(yīng)用程序,然后繼續(xù)導(dǎo)航。

如果您在App Store中有一個應(yīng)用程序,請使用您應(yīng)用程序的App Store ID。如果您還沒有應(yīng)用程序,請使用raywenderlich.com官方應(yīng)用程序。但是,由于您未導(dǎo)航到自己的應(yīng)用程序,因此無法看到鏈接在安裝過程中如何存在。

注意:如果您已經(jīng)知道如何查找App Store IDTeam ID并將其添加到Firebase項目的設(shè)置中,請立即進行操作。然后,隨時跳過接下來的兩節(jié),并繼續(xù)Setting Up Domain for Hosting。

如果您不知道如何設(shè)置它們,請繼續(xù)閱讀下面的內(nèi)容。

1. Setting Up the App Store ID

必須先找到raywenderlich.com應(yīng)用程序的App Store ID,然后才能使用它。將raywenderlich.com app store復(fù)制并粘貼到您的搜索引擎中。您會看到來自apps.apple.com的搜索結(jié)果:

通過這種方法,您可以在App Store上找到任何應(yīng)用程序的App Store ID

單擊搜索結(jié)果,然后在URL中查找id參數(shù):

raywenderlich.com應(yīng)用程序的App Store ID1481444772

接下來,打開Firebase控制臺,然后轉(zhuǎn)到Project Settings。 將1481444772復(fù)制并粘貼到App Store ID字段中:

接下來,您將添加Team ID。

2. Adding Your Team ID

Dynamic links需要您的Team ID才能起作用。 您可以在Apple Developer網(wǎng)站的Membership Details下找到它:

將其復(fù)制并粘貼到App Store ID下的Firebase項目設(shè)置中。

接下來,您將設(shè)置一個host domain。


Setting Up a Domain for Hosting

在使用Firebase Dynamic Links之前,您需要為其創(chuàng)建自定義域。

注意:在以下部分中,您將學(xué)習(xí)如何使用擁有的域上的自定義子域來設(shè)置Firebase Dynamic Links。它是可選的,如果您不擁有域,則可以跳至Creating a Free Firebase Custom Domain。

1. Setting Up Firebase Hosting

在將自定義域用于dynamic links之前,需要確保該域指向Firebase Hosting。如果您有要與dynamic links一起使用的域,并且該域指向其他host,則必須將其移至Firebase Hosting。如果您不想這樣做,則可以創(chuàng)建由Firebase托管的子域,該子域可用于動態(tài)鏈接。

注意:在某些情況下,例如,當(dāng)您已經(jīng)為dynamic links設(shè)置了自定義域并想要添加另一個域時,或者當(dāng)另一個站點托管您的host時,您必須手動設(shè)置域。為此,請按照Firebase文檔中有關(guān)Setting up a custom domain manually的說明進行操作。隨時跳過以下部分,并繼續(xù)在Adding Associated Domains in Xcode

打開Firebase控制臺。在Hosting下,單擊Get started

您會看到一組說明,以設(shè)置Firebase Hosting。

您目前無需完成指示的步驟,因為它們可以指導(dǎo)您設(shè)置您的域。 幾次單擊Next,然后單擊Continue to console

您會看到一個Firebase Hosting dashboard,其中包含兩個自定義的Firebase設(shè)置域:

您可以使用這些域來托管您的內(nèi)容。 但是,您將學(xué)習(xí)如何設(shè)置自己的自定義子域,然后將其用于dynamic links。

2. Creating a Firebase-Hosted Subdomain

在左側(cè)面板中,選擇Dynamic Links,然后單擊Get started。 首先,創(chuàng)建一個自定義子域:

選擇您的域唯一的內(nèi)容。

單擊Continue以添加可選的路徑前綴:

單擊Continue,將您的子域部署到Firebase Hosting。

您必須驗證要使用的域的所有權(quán)。 為此,請在DNS settings中添加具有唯一字符串值的TXT record

此步驟是必需的。 您的子域在完成之前不會上線。

注意:每個域名注冊商都有不同的過程來在DNS設(shè)置中添加TXT記錄。 如果不確定如何添加,請與您的提供商聯(lián)系或查看官方文檔。

這些更改最多可能需要24小時才能在您的域中展示。 一旦Firebase成功驗證了您的域所有權(quán)后,您就可以繼續(xù)進行設(shè)置。

驗證域后,從頭開始為您的子域重復(fù)設(shè)置。 單擊Verify。 然后繼續(xù)進行設(shè)置。

最后,通過訪問DNS提供商或注冊商將A record添加到您的域中:

您可以按照添加TXT記錄的相同方式添加一個記錄。

您的DNS記錄將如下所示:

不同的提供程序使用不同的命名約定,因此您的命名約定可能會有所不同。 如果不確定,請咨詢您的DNS提供商或閱讀其官方文檔。

這些更改最多可能需要24小時才能在您的域中傳播。

要查看該過程是否成功,請為您的項目打開Firebase Hosting。 您會在列表中看到您的自定義子域,并在其旁邊看到Connected

如果您想為iOS應(yīng)用上的Firebase dynamic links使用自定義域或子域,則設(shè)置中還需要執(zhí)行其他步驟。

打開Xcode。 在Info.plist中,創(chuàng)建一個名為FirebaseDynamicLinksCustomDomains的密鑰。 將其設(shè)置為應(yīng)用程序的Dynamic Links URL前綴:

或者,您可以使用免費的自定義Firebase域。

3. Creating a Free Firebase Domain

Firebase的優(yōu)點是您不必?fù)碛杏颉?Firebase提供了一個已經(jīng)與您的應(yīng)用程序相關(guān)聯(lián)的免費自定義域,您可以將其用于dynamic links

您可以通過給自己喜歡的任何名稱并將page.link附加到末尾來創(chuàng)建自己的Firebase自定義域。 這是dynamic links的自定義域。

打開Firebase console。 在Dynamic Links下,單擊Get started

域在全球范圍內(nèi)是唯一的,因此您不能使用圖片中所示的相同域。 但是,您應(yīng)該在可以使用的下拉列表中看到Google提供的以page.link結(jié)尾的域。

指定域后,請單擊Continue,然后單擊Finish。 您會在Firebase控制臺中看到您的域。

請務(wù)必將其寫下來,因為稍后您將需要它。

要完成此配置,請將Associated Domains添加到您的Xcode項目中。

4. Adding Associated Domains in Xcode

Associated Domainsuniversal links提供了基礎(chǔ)。

當(dāng)您想在應(yīng)用程序中使用deep links時,必須在托管站點上托管一個名為apple-app-site-association的文件。 這是必不可少的步驟,可在您的域和您的應(yīng)用之間建立關(guān)聯(lián)。

如果您將Firebase動態(tài)鏈接用于深層鏈接,則當(dāng)您成功創(chuàng)建Firebase上托管的域時,已經(jīng)為您設(shè)置了apple-app-site-association。

Xcode中的Signing & Capabilities下,單擊+ Capability。 添加Associated Domains

單擊+,然后以以下格式復(fù)制并粘貼您的域:applinks:[your domain]。

現(xiàn)在,您已經(jīng)添加了關(guān)聯(lián)的域,是時候在Terminal中測試deep link了。

5. Testing Your Deep Link in Terminal

要在不使用物理設(shè)備的情況下測試deep link,需要同時使用SimulatorTerminal。

Simulator中構(gòu)建并運行您的應(yīng)用。 一旦運行,請在模擬器中將其關(guān)閉,以查看主屏幕。 然后,打開終端并將其放置在可以同時看到終端和模擬器的地方。

將以下命令復(fù)制并粘貼到終端窗口中,將[your domain]替換為您在Firebase中為dynamic link創(chuàng)建的域:

xcrun simctl openurl booted [your domain]

按回車鍵,您的應(yīng)用程序?qū)⒘⒓创蜷_!

現(xiàn)在是時候構(gòu)建Firebase dynamic link了。


Building Firebase Dynamic Links

您可以通過四種方式創(chuàng)建Firebase dynamic links

  • Firebase控制臺中
  • 以編程方式使用Dynamic Link Builder API
  • 使用REST API
  • 手動

如果您要創(chuàng)建促銷鏈接以在社交媒體上共享,則使用Firebase console創(chuàng)建dynamic links非常有用。 該過程很簡單,Firebase會逐步指導(dǎo)您完成該過程:

使用iOSAndroid上的Builder API以編程方式創(chuàng)建鏈接對于用戶與用戶之間的共享或在需要dynamic link的任何情況下最有用。

另一方面,如果您要在沒有Builder API的平臺上創(chuàng)建鏈接,那么使用REST API是更好的選擇。

最后,如果您不需要跟蹤點擊數(shù)據(jù)并且不介意長鏈接,則可以使用URL參數(shù)手動manually構(gòu)建鏈接。 唯一的好處是避免了額外的網(wǎng)絡(luò)往返。

在本教程中,您將使用Dynamic Link Builder API創(chuàng)建動態(tài)鏈接。

您將首先創(chuàng)建URL。

1. Defining the URL

如前所述,您無需為本教程建立網(wǎng)站。 相反,您將使用raywenderlich.com官方網(wǎng)站。 如果您已經(jīng)建立了一個網(wǎng)站并擁有一個自定義域,請在本教程的其余部分中隨意使用它。

Xcode中,打開RecipeDetailView.swift。 將以下內(nèi)容添加到文件的頂部:

import Firebase

接下來,向下滾動到文件末尾。 在createDynamicLink()內(nèi)部,將// TODO 1替換為:

var components = URLComponents()
components.scheme = "https"
components.host = "www.raywenderlich.com"
components.path = "/about"

URLComponents從其組成部分構(gòu)造和解析URL。 它是Foundation框架的一部分。

在這里,您使用/ about路徑以raywenderlich.com“About”頁面為例。 理想情況下,使用此應(yīng)用程序,頁面會顯示食譜,因此,如果您使用自己的網(wǎng)站,請隨意使用托管食譜的頁面路徑。

接下來,將// TODO 2替換為:

let itemIDQueryItem = URLQueryItem(name: "recipeID", value: recipe.recipeID)
components.queryItems = [itemIDQueryItem]

要在網(wǎng)站或應(yīng)用中查找特定食譜,您需要使用所需的recipeID進行指定。

現(xiàn)在,將// TODO 3替換為:

guard let linkParameter = components.url else { return }
print("I am sharing \(linkParameter.absoluteString)")

在這里,您使用URLComponents對象創(chuàng)建URL。

構(gòu)建并運行。 點擊食譜卡,然后單擊Share。 現(xiàn)在,在您的Xcode控制臺中,查找print語句:

接下來,您將創(chuàng)建一個dynamic link。

2. Using Dynamic Link Builder API

您將使用Dynamic Link Builder API創(chuàng)建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組件對象,該對象具有您先前定義的URLURI前綴,這是您在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
  """)!

詳細(xì)分析:

  • 1) 您定義一個DynamicLinkIOSParameters對象,并以編程方式為其分配應(yīng)用程序bundle ID的值。
  • 2) 該鏈接需要知道將未安裝該應(yīng)用程序的用戶發(fā)送到哪里。 為此,您使用appStoreID。 如果您在App Store上擁有自己的應(yīng)用程序,請對其進行更改以匹配您的應(yīng)用程序ID。
  • 3) 然后,您可以使用socialMetaTagParameters定義在社交媒體帖子中共享時鏈接的外觀。 您可以從URL添加標(biāo)題,描述和圖像。 如果您的網(wǎng)站上有食譜,則可以為每個食譜分配一個適當(dāng)?shù)膱D片網(wǎng)址。 在這種情況下,您使用的是raywenderlich.com徽標(biāo)。

您可以將幾個可選參數(shù)添加到dynamic link中。 要了解有關(guān)這些參數(shù)的更多信息,請參閱Firebase Documentation。

最后,將// TODO 6替換為:

guard let longURL = linkBuilder.url else { return }
print("The long dynamic link is \(longURL.absoluteString)")

在這里,您可以檢索所需的dynamic link!

構(gòu)建并運行。 點擊食譜卡,然后點擊Share。 檢查您的Xcode控制臺輸出并查找輸出:

您可以按原樣使用此鏈接,因為它是功能性的dynamic link。 但是,它很長,共享時看起來也不好。

Firebase為您提供了一種縮短它并使它看起來更具吸引力的方法。

但是,為了縮短它,您需要對Firebase進行另一個網(wǎng)絡(luò)調(diào)用。 您需要將長dynamic link發(fā)送到網(wǎng)絡(luò)服務(wù),該鏈接將采用該長鏈接并返回縮短的版本。

如果您的用戶的網(wǎng)絡(luò)狀況較差,則縮短服務(wù)可能會花費太長時間。 此時,您的用戶可能會放棄并完全卸載您的應(yīng)用程序。 請記住,dynamic links的全部目的是節(jié)省用戶時間,而不是讓他們感到沮喪。

由您決定是喜歡長動態(tài)鏈接還是要縮短它。

接下來,您將學(xué)習(xí)如何縮短它。

3. Shortening the URL

要縮短長動態(tài)鏈接,請將其傳遞給.shorten(completion :)

仍在RecipeDetailView.swift中,在您添加的最后一個代碼下面添加以下內(nèi)容:

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,以便您可以在模擬器中測試您的應(yīng)用。

在閉包的末尾,您調(diào)用shareItem(with :),這是一個已經(jīng)定義的幫助程序方法。 它打開一個標(biāo)準(zhǔn)的共享表。

您的應(yīng)用程序現(xiàn)在具有共享dynamic links和重定向用戶(如果他們沒有該應(yīng)用程序)的所有功能。

構(gòu)建并運行。 點擊Share,您將看到一個共享表。

您可以在共享表單中看到您共享的鏈接的外觀,其中包含您定義的所有可選參數(shù):

在您的Xcode控制臺中,查找print語句以查看最終的縮短的動態(tài)鏈接的外觀:

現(xiàn)在是時候查看您的應(yīng)用程序了。

4. Seeing Your App in Action

要查看整個工作流程,請將您的模擬器和終端并排放置。 確保您的模擬器顯示主屏幕且未運行您的應(yīng)用程序。

將以下命令復(fù)制并粘貼到終端窗口中,將[your shortened dynamic link]替換為Xcode控制臺中的短動態(tài)鏈接:

xcrun simctl openurl booted [your shortened dynamic link]

按回車鍵,然后看到該應(yīng)用已打開:

要查看未安裝應(yīng)用程序時發(fā)生的情況,請從模擬器中刪除Raycipe。 長按Raycipe,然后選擇Delete App

請遵循相同的說明,并使用相同的簡短動態(tài)鏈接在終端窗口中再次運行命令:

您會看到dynamic link用來指導(dǎo)用戶安裝應(yīng)用的網(wǎng)頁。 如果單擊OPEN,它將帶您到App Store。 不幸的是,該功能在模擬器上不可用,但是您可以在真實設(shè)備上嘗試使用。

如果您沒有付費的Apple Developer帳戶,或者無法在物理設(shè)備上運行您的應(yīng)用,請參考以下示例,該鏈接在您共享或在Messages中接收鏈接時的外觀:

接下來,您將解釋您的dynamic link。


Interpreting Your Dynamic Link

有趣的來了! 您將把您的用戶定向到您應(yīng)用中的特定頁面。 當(dāng)用戶與食譜共享鏈接時,如果用戶在手機上安裝了該應(yīng)用程序,則接收該鏈接的任何人都將看到同一食譜的詳細(xì)視圖。

聽起來像魔術(shù),但事實并非如此。 您只需要了解所有秘密成分。

首先,請?zhí)幚砟鷳?yīng)用中的URL。

1. Handling the Incoming URL

SwiftUI中使用新的應(yīng)用程序生命周期,通過在場景中調(diào)用.onOpenURL(perform :)處理傳入的URL。 由于您只有一個場景,因此可以將其附加到該場景。 但是,如果您有更多的場景,則應(yīng)使用最頂層的場景,因為那是導(dǎo)航開始的地方。

打開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")
  }
}

這是正在發(fā)生的事情:

  • 1) .onOpenURL(perform :)接收傳入的URL。
  • 2) handleUniversalLink(_:completion :)URL解析為DynamicLink。 它進行網(wǎng)絡(luò)調(diào)用以將短動態(tài)鏈接轉(zhuǎn)換為完整動態(tài)鏈接并提取URL參數(shù)。 如果失敗,則返回錯誤。
  • 3) 您可以通過調(diào)用尚未定義的方法來處理檢索到的任何dynamic link,接下來將編寫該方法。
  • 4) 最后,您報告是否處理了該鏈接。 如果您正在使用其他universal links,則可以在其中進行處理。

要解決編譯器錯誤,請在// Handle incoming dynamic link下添加以下內(nèi)容:

func handleDynamicLink(_ dynamicLink: DynamicLink) {
}

您將在后面的部分中進一步充實它。

構(gòu)建并運行。 選擇一個食譜,然后點擊Share。

Xcode控制臺復(fù)制短URL,然后在終端窗口中運行以下命令:

xcrun simctl openurl booted [your short URL]

返回Xcode并查看控制臺輸出:

傳入URL和共享的dynamic link URL是相同的。

接下來,您將解析URL參數(shù)并提取recipeID。

2. Parsing the URL Components

打開DeepLinkHandler.swift。 在// Parse url下面添加以下內(nèi)容:

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,或者如果您擁有自己的網(wǎng)站,則為dynamic link使用該路徑。如果不是,它將僅打開應(yīng)用程序并顯示主視圖,因此它將返回.home。
  • 3) 確保傳入的URL有一個查詢字符串,比如recipeID=002的部分。
  • 4) 現(xiàn)在,您將query string拆分為其各個components。使用flatMap(_ :),將每個component分開,用=分隔,然后創(chuàng)建一個元素數(shù)組??雌饋硐襁@樣:[“ recipeID”,“ 002”]。
  • 5) 由于URL可以具有更多查詢參數(shù),因此您需要找到recipeIDindex并將其分配給idIndex。
  • 6) components數(shù)組有兩個元素,因此您的recipeID的索引為1。通過確保idIndex + 1小于components數(shù)(兩個)來檢查它是否存在。
  • 7) 最后,將recipeID值分配給.details(recipeID :)并將其返回。

您已經(jīng)解析了URL參數(shù)并提取了recipeID的值,但是您的應(yīng)用仍然不知道該如何處理。那是因為您需要確保需要此值的視圖將其接收。

接下來,您將使用環(huán)境值來執(zhí)行此操作。

3. Using Environment Values

了解您應(yīng)用的狀態(tài)通常會很有幫助。例如,也許您想在應(yīng)用程序激活時獲取新數(shù)據(jù),或者在應(yīng)用程序轉(zhuǎn)換到后臺后刪除所有緩存的數(shù)據(jù)。

SwiftUI跟蹤環(huán)境中場景的狀態(tài)。您可以使用@Environment屬性包裝器使其在應(yīng)用程序中的任何地方都可用。

您將使用這種方法并為deep links創(chuàng)建自己的EnvironmentKey。如果要了解有關(guān)Environment Values的更多信息,請查看有關(guān)該主題的Apple's Documentation。

Helpers文件夾中,創(chuàng)建一個名為DeepLinkKey.swift的新Swift文件。

import Foundation替換為:

import SwiftUI

然后,添加:

struct DeepLinkKey: EnvironmentKey {
  static var defaultValue: DeepLinkHandler.DeepLink? {
    return nil
  }
}

在這里,您聲明一種新的環(huán)境密鑰類型,并將其必需的defaultValue屬性指定為DeepLink?類型。

接下來,在文件底部添加以下擴展名:

// MARK: - Define a new environment value property
extension EnvironmentValues {
  var deepLink: DeepLinkHandler.DeepLink? {
    get {
      self[DeepLinkKey]
    }
    set {
      self[DeepLinkKey] = newValue
    }
  }
}

在這里,您可以通過使用新屬性擴展EnvironmentValues來創(chuàng)建自定義環(huán)境值。

現(xiàn)在,打開AppMain.swift,并在// Define deepLink下面添加:

@State var deepLink: DeepLinkHandler.DeepLink?

然后,在// Add environment modifier下面,添加:

.environment(\.deepLink, deepLink)

在這里,您可以通過在HomeView()上調(diào)用.environment(_:_ :)來設(shè)置視圖及其所有子視圖的環(huán)境值。

既然您定義了自定義環(huán)境密鑰,就可以結(jié)束對dynamic link的處理了。

4. Handling the Incoming Dynamic Link

打開AppMain.swift,然后在handleDynamicLink(_ :)內(nèi)添加以下內(nèi)容:

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
}

以下是代碼細(xì)分:

  • 1) 每個dynamic link都有一個matchType,該類型顯示您對用戶單擊該dynamic link庫的信心。 它有四種類型:unique, default, weak and none。 如果您在鏈接中共享的數(shù)據(jù)屬于私人性質(zhì),則需要確保匹配類型是unique。 否則,建議您不要顯示可從該鏈接中提取的任何個人信息,因為該鏈接以前可能已被使用過。
  • 2) 您調(diào)用parseComponents(from :)并將URL作為參數(shù)傳遞。 如果解析成功,則將返回的值分配給您的deepLink環(huán)境值。
  • 3) 由于它們在您的應(yīng)用程序內(nèi)存中仍然可用,因此您需要重置環(huán)境值。 如果用戶再次單擊相同的鏈接,則不會發(fā)生任何事情,因為環(huán)境值未更改。

構(gòu)建并運行。 選擇一個食譜,然后點擊Share。

從Xcode控制臺復(fù)制短URL,然后在終端窗口中運行以下命令:

xcrun simctl openurl booted [your short URL]

返回Xcode并查看控制臺輸出:

deepLink環(huán)境屬性的值是details(recipeID:“ 002”)。

剩下要做的就是使用此值導(dǎo)航到應(yīng)用程序中的特定詳細(xì)視圖。

5. Handling Navigation in Your App

打開HomeView.swift。 在// Define environment property下面/添加:

@Environment(\.deepLink) var deepLink

要從HomeView()或其任何子級內(nèi)部讀取環(huán)境值,請定義環(huán)境屬性包裝器。

接下來,在// Define navigation下面添加以下內(nèi)容:

// 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
  }
}

以下是代碼細(xì)分:

  • 1) 您將onChange(of:perform :)添加到視圖中。 每當(dāng)deepLink環(huán)境值更改時,它都會觸發(fā)一個操作。
  • 2) 接下來,找到具有指定recipeID的配方索引index
  • 3) ScrollViewReader是通過使用代理來提供程序化滾動的視圖。 您可以使用代理的scrollTo(_:anchor :)進行滾動。 它掃描滾動視圖,直到找到具有指定索引的第一個子視圖。
  • 4) 最后,將index值分配給cellSelected。 當(dāng)它收到一個新的索引值時,它會在NavigationLink的幫助下自動觸發(fā)導(dǎo)航到特定的詳細(xì)視圖。

構(gòu)建并運行。 選擇一個配方,點擊Share,然后使用Simulator and Terminal打開您的dynamic link。

現(xiàn)在,您的應(yīng)用程序可以將用戶引導(dǎo)至特定的配方詳細(xì)視圖:

您可以使用LinkPresentation框架使共享的鏈接更加豐富和友好。 如果您想學(xué)習(xí)方法,請查看 Visually Rich Links Tutorial for iOS: Image Thumbnails。

請務(wù)必查看 Firebase Tutorial: Getting Started,以了解Firebase如何為您的應(yīng)用程序增能。 如果您不知道從哪里開始,那么Firebase Official Documentation就是一個很好的起點。

后記

本篇主要講述了Firebase Dynamic Links的簡單使用,感興趣的給個贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容