（欢快的音乐）
- 大家好，我叫Ryan
是Firebase团队的软件工程师
负责Apple SDK 在加拿大滑铁卢办事处办公
- 大家好，我叫Chen
是Firebase团队的软件工程师
同样负责Apple SDK 在加利福尼亚州森尼韦尔办事处办公
- Firebase的使命是帮助开发者
轻松构建和操作应用来取得成功
- 我们都知道Firebase 是跨平台移动设备开发者工具包
支持iOS、Android Web、CIMA+以及Unity
我们也知道您参加本次会议的原因
如果您像我一样感兴趣，您可能会发现
Apple生态系统 让多平台应用开发变得更加容易
对iOS、iPadOS、macOS WatchOS、tvOS和Catalyst
等众多操作系统来说都是如此
Firebase团队正在研究一些用例
并在Apple平台上提供这些用例
适用于Apple平台的 Firebase SDK赋予您灵活使用
某些iOS开发流的能力
并会在将来继续赋予您更多能力
- 在过去几年里，适用于iOS 和其他Apple平台的结算和运行应用
在不断发生变化
Swift业已成为构建 应用时实际采用的编程语言
在本次会议中，我们会介绍 一些简洁的Swift语言功能和框架
例如，借助SwiftUI 我们可以使用简单又简洁的语法
构建美观的界面 而Swift Package Manager
可以让您更轻松地 将Firebase SDK添加到您的应用
Async/wait和Combine
是可以推理异步编程的新方法
Firebase团队正在密切关注这些变化
今天，我们会向您展示 如何应对生态系统中的这些变化
Chen，GitHub存储库现在进展如何？
- Ryan，我这就来介绍一下
自2017年 Firebase首次开源了客户端库以来
适用于Apple平台 的绝大多数Firebase SDK
现在都可以在GitHub上获得
2020年底，我们又开源了 Firebase Performance SDK
如果您还没有见过
建议去看一看，然后告诉我们您的想法
我们将继续致力于提高透明度
建立一个更强大的开发者社区
到目前为止，我们已经解决了 两千多个问题，合并了五千多个拉取请求
Firebase团队 期待在GitHub上与您进行互动
建议您积极提供反馈
无论是功能请求还是调试问题
因为您可以直接与我们的
SDK工程师进行交流，包括Ryan和我
这也使技术对话变得更加容易
我们很幸运能有这样棒的贡献者社区
目前，有139位用户正在为适用于Apple
平台的Firebase SDK做贡献
我们看到社区成员和Firebase成员
正在积极地进行开源合作
共同为用户提供支持
衷心感谢大家，让我们的SDK变得更好
开源使许多事情成为可能
单步执行代码可以
节省数小时的错误查找时间
同时提供了对 tvOS、macOS、Catalyst
以及WatchOS的社区支持
我们最近增加了对
实时数据库和远程配置的WatchOS社区支持
现在，您可以在手表应用中尝试此功能
使用GitHub Discussions提出任何问题
许多人已经开始使用 Swift Package Manager
来管理依赖项
Firebase现在正式支持 Swift Package Manager
因此，除了CocoaPods，现在还可以使用
Swift Package Manager 将Firebase库添加到您的应用
我来给大家快速展示一下，因为这真的太简单了
首先，从Firebase iOS SDK的报告页面获取网址
从页面复制网址
这种方法适用于大多数在 GitHub上托管或通过GitHub发布的库
在Xcode中打开应用，点击File选项卡
选择Swift Package 点击Add Package Dependency
粘贴网址，然后点击Next
选择所需的目标版本或分支
建议获取最新版本的SDK
以便使用新功能
并利用错误修复或性能改进
稍后，就可以选择要使用的产品
我们选择AnalyticsAuth
试用新的SwiftUI扩展程序API
需要知道的是，如果要将其添加到其他目标中
比如单独的手表目标
并且您只想在手表应用中安装Messaging
则可以在右侧选择一个目标
完成后点击Finish 此时若点击相应的项目
并选择Swift Packages 就应该能看到已添加的软件包
如果稍后想要 添加更多的Firebase SDK
选择要编辑的目标 点击General，然后找到
Frameworks, Libraries and Embedded Content
您可以手动添加Firebase SDK 也可以删除一些不再需要的SDK
现在，我们已使用 Swift Package Manager
创建了新项目，下面听听Ryan 对Swift和SwiftUI的进一步介绍
- 谢谢，Chen
虽然我们的SDK 主要是使用Objective C编写的
但我们仍会评估 每个API，了解如何将其导入Swift
努力让体验变得很好
但是，像结果类型、可编码支持
默认参数、枚举以及关联类型之类呢？
编写Objective C时 我们可以利用这些出色的Swift功能
有时，我们只需要编写Swift代码即可
这就是为什么我们开始为 不同的SDK提供可选的Swift扩展程序
还有一些是由社区贡献的
一起来看看其中的亮点 我们需要查看大量的代码
在下面这个代码段中，我们使用传统
CompletionHandler块 从Firebase Storage下载图片
数据和错误都是可选项
这会产生一些不良代码 致使我们必须强行打包错误
如果无法避免这些 不良代码，则不能实现我们的需求
数据为nil时，应该始终填充错误
出现错误时，数据应该始终为nil
但我们无法使用 现有代码在编译器中强制执行该操作
使用新的Swift扩展程序提供的功能
我们可以消除以上不良状态和强行解包
使用Switch语句，我们得到了仅由两个状态
表示的编译器安全性 要么有数据，要么有错误
不再有中间状态 我们接着讨论Firestore和解析数据
这段简短的代码片段显示了 Firestore快速入门早期版本的数据解析
从Firestore获取数据后
我们希望将其从提供的词典转换为本地类型
本例中为餐厅 这种代码是不是看上去很熟悉？
每次读到这个菜单，我都会很难过
在字符串键上解包错误 而没有利用Swift的类型安全功能
该代码非常脆弱 既难以读取，也容易在编写时出错
我们来为餐厅类型添加Codeable一致性
通过确认Codeable协议
我们可以免费获得大量
由编译器生成的手动代码解析 并且更新在整个类型中保持一致
现在，读取Firestore数据
就像在文档、快照上调用函数
以及在餐厅类型中解析那样容易
不再需要手动解析该对象 Codeable会为我们执行所有操作
在Firestore中设置数据也很容易
直接传入实例而不是词典表示形式
我们还为Firebase 数据库发布了一个类似的API
这要感谢一位外部贡献者
接下来，是令人兴奋的 全新SwiftUI，这也是我的最爱
我们最近发布了一些针对 SwiftUI的API，更多API也即将上线
在WWDC 2020上，Apple 发布了全新的SwiftUI应用生命周期
可以在各个平台之间共享
我们曾建议您将 FirebaseApp.configure
放在您应用的最上层，如果应用 已在AppDelegate中完成启动调用
如果不使用 AppDelegate，应该把它放哪呢？
我们仅需覆盖应用启动时调用的init函数
然后调用 FirebaseApp.configure
即使您以后需要使用 UIApplication Delegate
来处理推送通知之类的任务，也同样适用
我们稍后将在Chen的演示中看到
我首先展示的新API用于在 Google Analytics for Firebase
中记录手动屏幕视图事件 现有的API可以自动记录界面工具包的
屏幕视图和屏幕类
但是，SwiftUI没有
可以使用的相应界面视图控制器
所以使用SwiftUI时不起作用
幸运的是，去年我们添加了一个手动屏幕视图事件
因此您可以详细控制这些事件的记录时间
这适合在编写界面工具包时使用 将其集成到您的viewDid/Appear中
几乎不会出现任何问题
我们来看看该事件在SwiftUI中的样子
只要出现视图，我们就可以使用
onAppear修改器 调用这些手动日志API
这样做是可行的，但相当冗长
可能会使代码混乱，继而影响您的视图结构
从API的角度来看 我们在Objective C中提供的功能
相当有限 但在Swift中可以做得更好
这对自定义视图修改器而言似乎是一个很好的机会
而这正是我们正在构建的
我们现在可以使用提供的
analyticsScreen视图修改器
标记任何视图，声明视图名称、类或本例中的结构
当此视图出现在屏幕上时
我们将现有的分析命名
与您希望记录的任何额外参数相匹配
由于使用了Swift的默认参数
我们可以仅提供名称，其余皆为选填项
在本例中，我们不需要提供额外的参数
我们对这种标记视图
和记录屏幕视图事件的新方法感到非常兴奋
SwiftUI另一大改进 是可以构建您自己的应用内消息视图
在本例中，我们使用的 是modalInAppMessage修改器
闭包是一个视图构建器
参数是包含控制台中配置的数据消息
以及点击或关闭消息时向
In-App Messaging SDK
通知交互的委托
用于记录指标和展示次数
我们提供涵盖每种消息类型的API
这些API使从应用内消息 提供自定义界面变得前所未有的容易
如果您想分享 与其他SwiftUI帮助程序有关的想法
请您通过 GitHub Discussions告诉我们
社区对Combine感到兴奋，这无可厚非
因为我们也是如此 我们已经收到了社区贡献者
提供的一些精彩反馈
我们自己也在努力进行一些改变
在这个领域中仍有很多工作要做
下面简要介绍一下我们可以期待的功能
这是我们为使用 电子邮件和密码登录Auth而编写的发布器
其会返回Auth数据结果或
相关错误的组合结果
这个代码片段非常简单
但能实现提取用户，将所有错误替换为nil
然后将其分配给界面中
呈现的signedInUser属性
我们有跨不同STK的多个发布器
可帮助您实现异步数据流
您可以通过我们建立的GitHub项目
来关注我们组合式API的进展 Combine并不是在异步处理代码方面
取得的唯一令人兴奋的进展 我们很快就会在Swift Toolchain
最新版本中看到async/await函数
我们再来看看使用电子邮件和密码登录
将CompletionHandler函数 与Async/await函数进行比较
我们在此处使用 CompletionHandler处理控制流
在CompletionHandler内部 我们可能需要执行更多异步调用
这可能会导致经典的金字塔厄运
Async/await如何转换这个调用呢？
与完全在CompletionHandler块
当中管理状态不同 这看起来更像同步代码，且更易于推理
我们可以继续对其他异步调用执行相同的操作
这样维护状态和恰当处理错误
就会简单得多
现在把画面交给Chen，请她来给大家进行演示
-谢谢，Ryan
现在，让我们讨论如何 使用Firebase构建独立的手表应用
假设您想在手表上追踪每天的咖啡摄入量
独立手表应用的一个的妙处就是
用户无需从手机同步就可以使用应用
Firebase正努力实现将手表 直接连接到Firebase Cloud服务
以此简化手表应用的开发
目前，我们有几个产品 可以对WatchOS提供社区支持
例如，您可以从Firebase控制台
直接向您的手表应用发送推送通知
无需配对手机即可将您的咖啡摄入情况
与我们的实时数据库同步
也可以将图像 从Cloud Storage下载到手表
需要注意的是，您在控制台上设置的应用
应该与Apple Store Connect 中设置的应用实现一对一匹配
若其覆盖多个平台，则将一个Fibrous应用
和GoogleService-Info.plist 运用到运行该应用的所有平台
这也适用于iOS应用扩展
例如，若某个应用有iOS应用 Mac应用以及微件等目标，则只需将主应用的
GoogleService-Info.plist 文件导入所有目标即可
现在，您已经成功设置了Firebase产品
接着将plist文件导入Xcode
我们再来谈谈 如何将推送通知直接发送到您的手表应用
我们使用的是最新的SwiftUI生命周期
您会发现没有可用的扩展委托
默认情况下，SwiftUI生命周期
不包含任何应用或扩展型委托
您可以使用 WKExtensionDelegateAdapter
将委托注入到应用中 您可以在应用中添加代码
请求WatchOS推送通知权限
并处理任何需要应用 委托存在的Firebase SDK API
在本例中 您需要为消息SDK设置apnsToken
过去，启用Swizzling后
此步骤由Messaging自动处理
但是，由于Swizzling愈发脆弱
我们不再推荐在WatchOS中使用这种方法
您应该使用 WKExtensionDelegate
执行didRegisteredForRemoteNotifications方法
手动将 apnsToken设置到Messaging
如果使用SwiftUI生命周期 则以上方法同样适用于iOS应用
您需要使用 UIApplicationDelegateAdapter
从界面工具包注入自己的AppDelegate
然后，您就可以执行 需要AppDelegate存在的代码
我来向您展示一段代码 介绍如何直接将可爱又闪亮的图像
下载到您的手表应用 我们使用的是Firebase Storage
您注意到了吗？ 相同代码也可以在您的iOS应用上运行
是的，因为Firebase Storage
不需要像Messaging 这样的特殊WatchKey API
您可以在WatchOS、iOS、tvOS macOS应用中使用几乎完全相同的代码
我们还提供了一些应用扩展程序支持
因为它们确实可以帮助用户
更轻松地访问您的应用，做更多有趣的事情
以微件为例
WidgetExtension 可以很好地展示您的应用信息
还能对用户产生更大的吸引力
利用下面的代码片段
您可以使用Storage 将图片拉取到您的微件扩展程序
这样一来，您的微件 工具包中也会包含一张闪亮的图片
与基本图标相比，这种方法能够更好地
向用户展示应用的某些关键信息
以上就是本次会议的全部内容
在我们一起构建Apple应用的 这一段时光里，希望您过得开心
请一定要查看我们的GitHub存储库
您会发现很多有用的资讯
欢迎使用GitHub Discussions 试一试各种功能，关注错误修复消息
期待您使用Firebase构建自己的应用
（欢快的音乐）