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

版本記錄

版本號 時間
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 linksUniversal 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 LinksUniversal Links之上工作。它們特定于iOS 9引入的Apple平臺,并在提高性能的同時提供了更高的安全性。

使用Firebase設置動態鏈接可簡化實現deep linking的過程。

接下來,您將了解有關Firebase Dynamic Links更多信息。

1. Firebase Dynamic Links

無論用戶是否安裝了您的應用程序,Firebase Dynamic Links均可在AndroidiOS上運行。設置新的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 IDTeam ID添加到項目設置中。

理想情況下,您希望dynamic link指向App Store中的應用程序,以便新用戶可以安裝該應用程序,然后繼續導航。

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

注意:如果您已經知道如何查找App Store IDTeam 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 ID1481444772

接下來,打開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 Domainsuniversal 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,需要同時使用SimulatorTerminal

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會逐步指導您完成該過程:

使用iOSAndroid上的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組件對象,該對象具有您先前定義的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
  """)!

詳細分析:

  • 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可以具有更多查詢參數,因此您需要找到recipeIDindex并將其分配給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的簡單使用,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容