大多数浏览器和
Developer App 均支持流媒体播放。
-
使用‘同播共享’来共享文件
了解如何在 SharePlay 活动中处理文件和附件。我们将解释如何使用 GroupSessionJournal API 更快地同步大量数据,并在示例 DrawTogether App 演示中向你展示如何使用该 API。
章节
- 0:49 - Transfer attachments
- 2:10 - GroupSessionJournal
- 4:42 - Late joiners
- 6:18 - Adopt in DrawTogether
资源
相关视频
WWDC23
-
下载
♪ ♪
Adam:大家好 我是 Adam 是 SharePlay 团队的一名工程师 今天我们将要谈论 一个许多人一直在询问的 令人兴奋的新功能 看到本次讲座的标题 大家也许已经猜到了 我们将要介绍如何 通过同播共享来共享文件 首先我们将介绍传输附件的含义 我们将你想分享的 文件或任何大量数据 称为“附件” 然后将介绍 GroupActivities 中的 新 API 即 GroupSessionJournal 之后 我们将介绍后加入者 最后 我们将来看看在 我们的 DrawTogether App 中 采用 GroupSessionJournal 有多容易 让我们先来 了解一下传输附件的含义 让我们通过 我们的绘图 App 来介绍 我们可使用 GroupSessionMessenger 在两个设备之间同步绘图 但如果我们将图像 放入画布中会发生什么呢? 由于 GroupSessionMessenger 有大小限制 你以前无法使用 同播共享进行同步操作 但现在 我们已使得 相同的 Apple 基础设施 不仅可在设备之间 提供超快速的消息传递 还可传输附件 因此现在当你将可爱的 狗狗照片放入画布中时 会通过我们的 云基础设施比以往更快地传输 这利用了多层 Apple 技术 以最小化需要传输的数据 并最大程度缩减空闲等待时间 这一切都是为了使体验尽可能快速 所有这些都发生在系统层 但这并非全部 同播共享考虑到了 用户的隐私 因此所有这些 都是在确保你在设备间传输的数据 是端到端加密的情况下完成的 Apple 不知道传输的数据内容 这不仅适用于 Mochi 狗狗可爱的 照片 还适用于你想要的任何内容! 你有 PDF 之类的文件吗?可传输! 录音或注释怎么样? 任何用户协作的内容 现在都可通过 这个新的 API 更快地传输 那么现在这个 API 是什么样子的呢? 好吧 让我们深入了解一下! 你要熟悉的主要对象是 “GroupSessionJournal” 该对象是 iOS 17 的新对象 就像你习惯了的 “GroupSessionMessenger”一样 该对象使用你的 “GroupSession”进行初始化 但了解该对象的目的很重要 该对象在整个 GroupSession 中 对每个人都保持一致 这意味着你在日志上 执行的操作会影响每个人 且日志上的属性也会同步给每个人 让我们通过一些示例来说明 一旦你拥有了你的日志 你可通过“attachments” 异步序列观察到附件的突变 你可使用我们的“add” 函数上传任何自定义附件 你只需使你的类型 符合 Transferable 协议即可! 所以现在 当一个设备 调用“add”时 不仅其“attachments” 异步序列会给出新的附件 且 GroupSession 上的每个人 都会看到相同的事件发生 并能够加载你正在上传的附件! 同样地如果 你通过调用“remove”函数 删除附件 则每个人的“attachments” 异步序列都会更新事件 差不多就是这样 你可看出你能如何轻松地 通过该新的 API 上传和接收附件 在我们在 DrawTogether App 中 深入实现此功能之前 让我们谈谈在利用该新 API 时需要考虑的一些重要问题 附件大小不允许无限制 实际上附件大小 被限制为 100 MB 这是为确保我们仔细考虑用户体验 这些体验需要快速 设备只能以有限的 速度上传和下载数据 因此 你应始终尝试最小化 要发送的附件大小 这可能意味着 如果你有一个绘图 App 你可限制允许在画布上的 照片小于或等于 100 MB 任何围绕用户生成内容的数据 都非常适合放在这里 但非用户生成的较大附件 如电影 仍应从你自己的服务器提供 而非通过用户的设备提供 然后是生命周期 只要 GroupSession 中有人 日志上的任何内容都将保留 这意味着即使将附件添加到日志的人 断开 GroupSession 连接 附件也会保留下来 但如果每个人都离开了 GroupSession 则附件也随之删除 如果你习惯于与 GroupSessionMessenger 集成 你可能会记得这个主题:后加入者 通常当一个新人 加入 GroupSession 时 你的 App 将必须 重新传输你的世界状态 以便其与组中的其他人保持同步 这是由你 App 采用的 GroupSessionMessenger 来管理的 每个设备都会向需要赶上进度的人 发送消息 这可能极其耗费资源 让我们看看下面的例子 假设我们 有两个人在一个 GroupSession 中 Adam 和 Brian 与此同时 Clara 还未加入 所以 在 Clara 加入之前 Adam 和 Brian 正在愉快地画画 Adam 画了一根狗骨头 Brian 也在其设备上得到了更新 现在 Clara 继续加入 但是她的画布在加入时是空的! 她的设备需要获取 Adam 和 Brian 正在画的内容 以便她能跟上他们 此时 Adam 和 Brian 都必须向 Clara 发送 他们所理解的世界状态 Clara 的设备将会趋同 以便她与他们处于同一进度点 现在如果你添加一个附件而非图画 从 Adam 和 Brian 处 发送的消息可能会变得非常大 你可以想象到 这会成为一个问题 每个人都需要重新上传 100 MB 内容 只为给一个设备传输图像 好了 现在你可在 GroupSessionJournal 上处理后加入者 后加入者将在其 日志中接收到上传的附件 而无需其他人重新上传 这使得体验更快速 更节省带宽 现在我们已经了解了很多信息 让我们进入有趣的部分 看看这个魔法是如何工作的 我们将演示如何在 我们的 DrawTogether App 中 采用 GroupSessionJournal 这是我们要修改的 DrawTogether App 如你所见 我们在底部有一些按钮 可让我们开始同播共享会话 还有一个垃圾桶按钮来重置会话 我想如果我们在底部有一个按钮 允许我们选择要放在 画布上的照片 那会很不错 SwiftUI 使这很容易入门 所以让我们直接开始吧! 我们需要修改四个主要组件 首先是我们的“Canvas”模型 这是我们整个 App 的主要模型对象 该对象追踪我们的本地 和远程参与者的所有笔画 且它是 我们与 GroupActivities 的接口 然后我们有三个视图 有“ContentView” 其包含有 我们其他两个视图的所有子视图 “ControlBar”视图 该视图在底部保留了之前的按钮 以及“CanvasView” 该视图从我们的模型中 绘制所有对象的笔画 不久之后 还将能绘制图像 让我们从我们的模型开始 我们需要追踪两件事 首先 我们将使用一个新的结构 “CanvasImage”来追踪 我们从日志中获取的所有图像 其次 如果我们 试图放置一个或所有图像 则追踪本地选择的图像 现在我们让 Canvas 创建一个“GroupSessionJournal” 并将在 configureGroupSession 函数中处理其中的所有附件 我们将创建一个函数 将本地选择的图像添加到日志中 我们可从我们的视图中调用该日志 现在我们已有了所有非 UI 部分 让我们继续修改一些视图 我们将从选择照片的按钮开始 如果你还记得刚才说的 我们 想在 ControlBar 中添加该按钮 让我们导入 PhotosUI 并使用 “PhotosPicker”视图添加新按钮 并用“selectedImageData” 将其直接放到模型上 我们已创建了一个简单的视图 叫做 PhotoPlacementView 该视图可以可视化所选的照片 并允许我们在画布上 将其移动到我们想要的位置 现在让我们将该视图 添加到 ContentView 中 让我们看看我们的进展 我们可以开始一个会话 然后就得到了我们的“照片”按钮 让我们选择一张照片 砰! 我们有了一个可拖动的图像 现在最后一部分 是我们要修改“Canvas”视图 以可视化模型中的所有图像 现在如果我们试一下 我们 可以看到在我们选择图像最终位置时 图像同时出现在两个设备上 呼 现在我们完成了 我认为我们的体验非常酷 感谢大家的收看 现在你已看过本次讲座 继续看看你现在 可用 GroupActivities 构建哪些 极为出色的体验 如果你还未采用 GroupActivities 请查看 “将同播共享添加到你的 App” 以了解同播共享对 App 的意义 如你想了解如何开始 使用此 DrawTogether App 或是想看一些 采用 GroupActivities 的示例 请查看“使用 GroupActivities 构建自定义体验” 再次感谢观看 我们迫不及待地想看到你的作品! ♪ ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。