基于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的简单使用,感兴趣的给个赞或者关注~~~

推荐阅读更多精彩内容