版本记录
版本号 | 时间 |
---|---|
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
的简单使用,感兴趣的给个赞或者关注~~~