大多数浏览器和
Developer App 均支持流媒体播放。
-
照片挑选器的新增内容
您可以在您的 App 和系统照片图库之间简单而安全地集成照片挑选器。了解 SwiftUI 和 Transferable 可以如何帮助您在 iOS、iPadOS、macOS 和 watchOS 中进行集成。我们还将向您介绍如何利用 AppKit 和 NSOpenPanel 将 Mac 版照片挑选器集成到您的 macOS App。有关照片挑选器的更多信息,请观看 WWDC21 的“优化 App 中的照片访问”。
资源
相关视频
WWDC23
WWDC22
WWDC21
WWDC20
-
下载
♪ 柔和乐器演奏的嘻哈音乐 ♪ ♪ 大家好 我是 Justin 照片团队的工程师 今天 我想介绍一些针对 系统照片选择器做出的改进 系统照片选择器 是大多数 App 访问 iOS 中照片和视频的最佳方式 选择器在进程外独立运行 这样您的 App 无需请求任何 库访问权限便可使用选择器 它具有直观的 UI 和易于使用的 API 如果您不熟悉 PHPicker API 您可以观看我们 往年的 WWDC 会议 我们有详细的介绍 今天 我将从在选择器中 添加新功能的概览开始 然后 我将介绍当前一些其他的 选择器所支持的平台和框架 那么 我们一起深入探讨吧 一经推出 选择器便支持 过滤图像、视频、和实况照片 但是 我们了解到您的某些 App 可能有其他需求 例如 一个屏幕截图拼接 App 只需要显示选择器中的屏幕截图 当前可以使用今年新增的 屏幕截图过滤器 除了屏幕截图 我们还添加了其他资产类型 比如录屏和慢动作视频 您还可以使用 PHAsset.PlaybackStyle 创建新的过滤器 除了电影视频、 深度效果照片和连拍 所有新过滤器都已向后移植 如果您的 App 面向的是 iOS 15 只要您使用 iOS 16 SDK 进行编译 该功能仍可继续使用 对于复合过滤器来说 除了现有的“any” 现在您也可以使用“all”和“not” 而且也已向后移植到 iOS 15 我们一起看一些代码示例 要显示视频和实况照片 您可以将其与“any”结合 或者您可能只想显示屏幕截图 要显示除屏幕截图以外的所有图像 您可以使用“all”和“not” 来结合图像和屏幕截图过滤器 最后 如果您面向的是 iOS 16 您可以使用 .cinematicVideos 过滤器 接下来 我将介绍与半高选择器 有关的改进 在 iOS 15 中 UIKit 具有新的 UISheetPresentationController API 可用于以半高模式呈现选择器 其在大多数情况下可良好运作 但是有些人可能想要实现自定义 UI 以调整选定的资产并将这些更改 反映回选择器中 在 iOS 16 中 您可以使用其资产标识符 来取消选择资产 如此处所示 调用 deselectAssets 后 选择器已取消第二张照片的选择 您还可以调用 moveAsset 方法 对资产进行重新排序 现在我们熟悉了 所有新的选择器功能 我将介绍平台支持 目前 系统照片选择器只能 由 iOS 和 iPadOS App 使用 今年 我们把照片选择器 引入到了其他两个平台 分别是 macOS 和 watchOS iPadOS 选择器也更新了设计 但这一新的设计仅适用于 iPad 我们先来看看新的 iPad UI 选择器现在显示了侧边栏 以利用更大的 iPad 显示屏 侧边栏使不同收藏夹之间的 导航更加快捷 但是如果没有足够的空间 就像在分屏模式下一样 我们将回退到 现有的紧凑型选择器 UI 接下来是 macOS macOS 选择器还具有 Mac 风格控件的侧边栏 和 iOS 选择器一样 支持多选 网格中的流体缩放 并具有强大的搜索功能 允许您搜索诸如人物、地点、 等等分类 新的选择器 UI 也应用到了 NSOpenPanel 中 您可以用其选择系统照片库中的资产 并且首次支持 选择存储在 iCloud Photos 中的资产 您的 App 将免费获得新的 UI 而无需采取任何适配操作 NSOpenPanel 选择器支持拖放 iOS、iPadOS 和 macOS 上的标准选择器 也支持该操作 如果您的 App 只需要 选择几张图片或几个视频 NSOpenPanel API 将满足您的需求 但请记住 照片库中所选的文件 可能随时被系统删除 如果您需要确保其长期可用性 您应该将其复制到 由您的 App 管理的位置 对于以媒体为中心的 macOS App 我们建议您默认为 新的照片选择器 以获得最佳用户体验 但是 您的 App 仍应 提供一种可替代方式 来使用 NSOpenPanel API 从文件系统中选择资产 有时您的用户可能仍想在照片库外 选择资产 最后 我将介绍 watchOS 首次 您能够访问存储于 使用全新 API 手表里的图像 watchOS 选择器也会用完进程 和 iOS 和 macOS 选择器一样 因此您无需请求任何 库访问权限即可使用 其 UI 类似于 iOS 选择器 但针对较小的屏幕进行了优化 您可以在网格中或 按收藏夹浏览您的照片 您可以配置选择器以显示选择顺序 以及指定选择限制 但是 与 iOS 和 macOS 不同的是 只有图像会显示 在 watchOS 选择器中 如果设备存储的照片超过 500 张 将只显示最近的 500 帐图像 您可能想知道 “PHPickerViewController 是基于 UIKit 的 那么如何将其用于我的 macOS 或 watchOS App 中?” 您可能已经猜到了 AppKit 和 SwiftUI 目前提供了新的选择器 API 我们先来看看 AppKit API 实际上 其与 UIKit API 十分相似 您有权限访问相同的 PHPickerConfiguration 类型 及其属性 只有一个很小的区别: PHPickerViewController 是一个适用于 AppKit App 的 NSViewController 子类 随着基于 AppKit 的 PHPicker 的引入 是时候舍弃传统的媒体库浏览器了 PHPicker 要强大得多 如果您正同时打造 UIKit 和 AppKit App PHPicker 也更加容易维护 最后 我将介绍 SwiftUI API
还记得您在本视频开始时 看到的 iOS 选择器吗? 只需几行 SwiftUI 代码 即可将其呈现 更重要的是 您有权访问 所有支持选择器的平台上的 SwiftUI PhotosPicker API iOS、iPadOS macOS 和 watchOS 选择器将根据平台 您 App 的配置 和可用的屏幕空间 自动选择最佳布局 您无需为选择器 UI 绞尽脑汁 这样您可以更加专注于 将您的 App 打造得更加完善
在我们通过演示 详细了解新 API 之前 我将先介绍如何加载 已选择的照片和视频 您通过 SwiftUI 绑定收到的选择 只包含占位符对象 您仍然需要按需加载实际资产数据 请记住 某些资产数据 不会立即加载 如果遇到错误 加载操作也可能失败 例如 选择器 尝试从 iCloud Photos 下载数据 但设备未连接 到互联网 一些像视频这样的大文件 可能需要很长时间才能下载 所以我们建议您显示 每个项目的内联加载 UI 而替换掉阻塞加载指示器 PhotosPicker 使用 Transferable 这是一种用于 在 App 和扩展程序之间 传输数据的新 SwiftUI 协议 您可以直接通过 Transferable 加载 SwiftUI Image 但对于高级用例 您应该定义符合 Transferable 协议的 自己的模型对象 以完全控制要加载的数据类型 有关 Transferable 的更多信息 您可以查看 “Meet Transferable”一期 如果您的 App 需要 同时处理很多项目 或类似视频等大型资产 将所有内容同时加载到内存中 或许不可行 为了减少内存使用 您可以使用 FileTransferRepresentation 将选定的资产加载为文件 当将资产作为文件加载时 请记住 您的 App 将负责 管理这些资产的生命周期 文件在收到时应始终 复制到您的 App 目录 并在不需要时将其删除 现在我要开始演示了! 我已经将此演示 App 设置为显示帐户个人资料页面 现在 个人资料图像 只是一个占位符图标 我们想使用 PhotosPicker API 添加一个编辑按钮 来更改个人资料图像 个人资料图像视图已经可以响应 我们视图模型中定义的图像状态 所以我们只需在收到选择器选择时 更新图像状态 首先 我们进入我们的视图模型 并添加一个新的 imageSelection 属性 其将作为选择绑定 传递给 PhotosPicker API 现在我们可以回到 我们的个人资料图像视图 并添加一个启动选择器的覆盖按钮
好了 我们暂停一下 并查看一下 我们刚刚添加的代码 我们添加了一个 PhotosPicker 视图 向其传递了我们 刚刚定义的选择绑定 并将其配置为仅显示图像 PhotosPicker 的标签 是一个带有圆形背景的 铅笔标志符号 我们可以生成并运行 以查看我们目前所有的操作 可以点击编辑按钮来启动选择器 点击图像会自动关闭选择器 但不会更新个人资料图像 为什么? 我们还需要连接图片选择 和图像状态 所以 我们开始连接吧 我们可以回到视图模型 并响应已设置的图像选择 如果图像选择数为零 我们将图像状态设置为 empty 否则 开始加载图像 可以看到发生了一个编译器错误 因为我们还没有实现 loadTransferable 方法 接下来 将其修复
实现过程非常简单 我们只需要响应完成处理程序 并更新图像状态 前提是请求仍是最新请求 我们生成并运行 以查看它的运行情况 我可以点击 编辑按钮并选择一个图像 非常好!运行符合预期 实际上 该项目也已设置为 可在 macOS 上运行 我刚刚添加的代码 会自动在 macOS 上运行吗? 我们生成并运行以找出答案 可以编译! 我可以打开选择器 选择一张图像 图像可以显示在 App 中 这就是所有的演示了 您刚刚看到了在 iOS 和 macOS 上的演示 其实相同的代码 也可以在 watchOS 上运行 但是 有几件事要记住
watchOS 选择器 专为简单的流程 和短暂的互动而设计 图像根据设备尺寸进行缩放 通常 图像将与 已配对的 iPhone 同步 但是 家庭设置可以让没有 iPhone 的家庭成员 享受 Apple Watch 的 功能和优势 如果设备处于家庭设置模式 可以使用选择器 选择 iCloud 照片中 最近的 1000 张图像 选择器可能需要 从互联网中下载一些图像 如果这样的话 关闭之前 选择器中将显示加载 UI
本期结束之前 我想对您说 我们致力于使系统照片选择器 成为大多数 App 访问 照片和视频的最佳方式 如果您仍在使用自定义选择器 我们真的鼓励您 换用系统照片选择器 谢谢 祝您在 WWDC 愉快! ♪
-
-
0:01 - PHPicker Example (UIKit)
var configuration = PHPickerConfiguration() configuration.filter = .images configuration.selection = .ordered configuration.selectionLimit = 10 let picker = PHPickerViewController(configuration: configuration)
-
0:02 - PHPickerFilter
var configuration = PHPickerConfiguration() // iOS 15 // Shows videos and Live Photos configuration.filter = .any(of: [.videos, .livePhotos]) // New: iOS 15 // Shows screenshots only configuration.filter = .screenshots // New: iOS 15 // Shows images excluding screenshots configuration.filter = .all(of: [.images, .not(.screenshots)]) // New: iOS 16 // Shows cinematic videos configuration.filter = .cinematicVideos
-
0:03 - PHPicker Example (AppKit)
var configuration = PHPickerConfiguration() configuration.filter = .images configuration.selectionLimit = 10 let picker = PHPickerViewController(configuration: configuration)
-
0:04 - PhotosPicker Example (SwiftUI)
struct ContentView: View { @Binding selection: [PhotosPickerItem] var body: some View { PhotosPicker( selection: $selection, matching: .images ) { Text("Select Photos") } } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。