大多数浏览器和
Developer App 均支持流媒体播放。
-
文件管理和快速查看的新功能
您的 iOS app 现在可以通过 USB 和 SMB 访问外部设备上储存的文件。学习创建用来读取、写入和管理实体媒介或网络储存空间文件的文稿类 app 的最佳做法。了解 iOS 和 macOS 上帮助您访问和显示文件缩略图的“快速查看”增强功能。
资源
相关视频
WWDC19
-
下载
欢迎大家走进 文档管理和快速查看的新功能 我们有很多很棒的新 API 用于管理文档和文件预览 今天将与你们共享
以下是我们在本次大会中 将会讨论到的领域 首先我们将展示 你的 App 如何使用 文档选择器访问目录及其内容 我们还将展示 你的 App 如何正确支持 存储在外部 USB 驱动器 或 SMB 服务器上的文件
然后还可以查看 你的 App 如何获取并显示 丰富的缩略图
另外你还将看到 App 如何通过快速查看 为图像 PDF 和视频 提供快速编辑支持 我们可以很容易 将你的 iOS App 移植到 macOS 因为快速查看扩展 API 现在是跨平台的 最后我们将谈论 如何在 Mac 上支持 iPad App
那这个会议的受众是谁呢 如果你正在编写一个新的 App 或者已经有了一个 显示文档或执行文件操作的 App 你就来对地方了 你可以在这里学习支持 存储在可移动驱动器 如 USB 和 SMB 上文件的最佳实践 可能还需要你的 App 以递归方式 访问文件夹中多个文档 并执行批处理文件操作
如果你想了解更多 关于显示文件缩略图的信息 或者你想在 App 中 提供简单的图像和视频编辑 就请坚持看下去
顺便说一下 如果你还没有了解过 你一定要看看 2018 年 WWDC 的 《Managing Documents in Your iOS Apps》 其中我们详细介绍了 如何使用 UIDocumentBrowserViewController 以及 UIDocumentPickerViewController
还有一场会议 如果你对在 iOS 和 macOS 上 展示文件预览感兴趣的话 我们强烈建议你 看一下 2018 年 WWDC 中的 《Quick Look Previews from the Ground Up》 最需要的功能之一 是访问整个目录及其内容 我们真的很高兴 你现在可以使用 iOS 13 实现了 此外你 App 中的功能 可能需要访问目录的内容 以便读取 写入或创建文档 例如图像编辑器 需要对一批图像 应用相同的更改 这些图像将读取每个图像 应用更改 并在原始图像旁边保存新图像 在 iOS 13 之前 一个 App 可以通过 UIDocumentPickerViewController 访问其 App 之外的文件 但是用户一次 必须选择一个文件 iOS 13 的新功能是 你的 App 可以提供一个 UIDocumentPickerViewController 让用户选择一个文件夹 通过验证后 App 将被授予 对目录及其所有内容的 递归访问权限 此外 你还可以设置 显示在文档选取器上的默认目录
现在我们来看一下 如何做到这一点 比如我们如何配置 UIDocumentPickerViewController 若要允许选择文件夹 请创建用仅包含 kUTTypeFolder 类型的 数组初始化的实例 然后显示该实例
要设置 UIDocumentPickerViewController 实例的默认目录 请设置其 directoryURL 属性 然后显示 现在让我们看看这个例子 我们将展示 如何枚举文件夹的内容 不过你可以使用相同的示例 在这里使用标准的文件管理 API 来编写文件
另外请确保使用 URL.start/stopAccessing SecurityScopedResource 调用 并使用 NSFileCoordinator API 进行读写操作 如示例中所示
在 iOS 13 中 用户可以控制哪些 App 可以访问哪些文件夹 此访问权限已列出 可以在“隐私”中的 “文件和文件夹”部分撤消 请注意 由于用户可以随时 撤消访问权限 因此在尝试打开文档 或枚举文件夹时 需确保代码正常处理错误 在此示例中 你可通过存储书签数据 然后使用 URL resolvingBookmarkData 选项调用 重新创建 URL 从而在 App 启动时 保持对文件夹的持久访问
在 iOS 13 中 我们新增了对外部 USB 驱动器 拇指驱动器和 SMB 服务器的支持
支持格式化为 APFS HFS + FAT 和 ExFAT 的驱动器
驱动器可以插入 iPad Pro 上的 USB-C 接口 也可以通过 SD 卡 读卡器附件插入
它们会自动列在 文件 App 的侧边栏中 或者列在带有 UIDocumentPickerViewController 或文档浏览器的 App 当中
用户还可以使用 与查找工具相同的键盘快捷方式 或使用侧边栏菜单 使用“连接到服务器”操作 连接到 SMB 服务器
只要 App 是使用 iOS 13 SDK 或更高版本构建的 UIDocumentBrowserViewController API 或 UIDocumentPickerViewController API 的 任何客户端 都可以直接获得相同的支持
但是你需要 检查几个地方 以确保你的 App 对 USB 和 SMB 有很好的支持
有一些预设现已不再适用 文件访问 不再位于单个卷上 因为它们现在 可以存储在外部卷上 如 USB 或 SMB 服务器
如果 USB 驱动器拔出 或与 SMB 服务器卷的 网络连接丢失 卷可能会消失
磁盘访问速度可能 比你过去预期的速度慢 根据网络条件 或 USB 设备的速度 你假定的即时操作 现在可能需要几秒钟 甚至几分钟
此外不要假设 底层文件系统始终是 APFS 或 HFS+
那么这对你的 App 有何影响
如果你需要将文件 从一个位置移动到另一个位置 请使用 API 中的 FileManager.moveItem 它负责处理跨卷移动文件
过去移动和克隆操作 一直很快 在卷上移动时 复制和删除操作可能会变慢 如果使用 NSTemporaryDirectory 保存文件的临时版本 则应更新代码 以根据写入文件的 最终目标 选择临时文件夹的位置
你可以使用以下文件管理器
userDomainMask properFor URL 中的 itemReplacementDirectory 的 文件管理器 URL 来执行此操作 这将始终为你提供 正确的临时目录来写入文件 在过去 你的 App 可能会假设 一个文件打开时永远不会消失 这不再是真的 因为 USB 驱动器可能被拔出 SMB 服务器连接可能会中断 这可能会导致 App 在读取或写入文件内容时失败 你的 App 应检查错误 并正常失败
我的一个建议是 如果 App 无法写入文件 它可以显示 UIDocumentPickerViewController 让用户选择一个备用位置来保存文件 读取或写入存储在 USB 驱动器或远程 SMB 服务器上的 文件可能会很慢 因此需要确保 在执行文件操作时 App 不会挂起 而是始终在后台队列上 执行文件系统操作
我们还建议你 添加 UI 作为活动指示器 让用户知道正在发生什么 并为用户提供 取消操作的方法
否则用户可能会觉得 App 没有响应 当文档存储在 USB 驱动器 或远程 SMB 服务器上时 LIFS 将被报告 而非媒体格式化的文件系统 很可能你的 App 不用担心底层的文件系统 相反你应该 检查文件系统功能 以了解支持哪些 文件系统操作
LIFS 是一个 文件系统抽象 它不直接寻找它的存在 要了解有关 LIFS 的更多信息 我们建议你查看 “文件系统中的新功能”会话
iOS 13 中的新功能 是在 UIDocumentBrowserViewController 当中提供额外的 自定义支持 下面我们来看一下 现在通过将 shouldShowFileExtensions 属性设置为 true 可以选择始终显示 文件扩展 现在还可以 自定义创建文档按钮 以通过设置 defaultDocumentAspectRatio 属性 来调整按钮图标的宽高比 现在可以通过设置 localizedCreate DocumentActionTitle 属性 来更改标题为 Text 的按钮 接下来 Lyn 将介绍 快速查看的新功能
在你的 App 中 获取文件缩略图 现在可以通过设置希望通过显示 丰富的文件缩略图 来增强 App 外观的开发者
你可以有这样的东西 但是这样会更好
快速查看缩略图是一种 新的跨平台框架 用于检索文件 URL 的 缩略图图像 这是 iOS 上的新功能 并取代了 macOS 上 用于 QLThumbnail 的 C API 它还取代了 NSURLThumbnailDictionaryKey
iOS 和 macOS 为多种文件类型 提供内置支持 如图像 PDF 文本文件和视频等 你还可以使用缩略图扩展 为自己的文件类型 提供支持
快速查看缩略图 是非用户界面框架 我们默认 不导入 UIKit 或 AppKit 我们可以不使用任何方法 获取你的 CGImages 缩略图 但你也可以分别通过 显式链接 UIKit 或 AppKit 来获取 iOS 上的 UIImages 或 macOS 上的 NSImages
它是异步的 因此在检索缩略图时 不会阻塞 并且它支持取消 以防你最终决定 不需要该缩略图
我们来从整体概述开始 要获取缩略图 首先要创建一个 QLThumbnailGenerator.Request 然后将其传递给 QLThumbnailGenerator 指定是否希望 每次有新的缩略图表示时 或仅在你请求的 最佳表示完成时 收到通知 你可以请求 不同的缩略图表现 这将具有不同的 质量和性能成本
icon 是与该文件类型 关联的通用图像 这对于给定类型的 所有文件都是相同的 lowQualityThumbnail 是我们能够 提供的更快的缩略图 可能与你指定的尺寸 不完全相同 这通常来自缩略图的 缓存版本 或者可能是嵌入到 文件本身中的缩略图
最后一个表示类型 thumbnail 是缩略图的完整质量版本 与请求完全匹配 这将花费最长的时间来生成
为方便起见 你还可以指定获取 任何类型的可用缩略图 创建 QLThumbnail 生成请求时 你可以指定所需的大小 比例和表示类型 你可能只关心 完整质量的缩略图 或者你也可以使用图标或较低质量的版本 最好指定适合你的 所有表示类型 因为并非所有三种类型 都可用于给定的缩略图
你将会得到一个 QLThumbnailRepresentation 它将指定缩略图的 类型 图标 低质量或缩略图 以及一个可以 作为 CGImagecgimage 访问的图像 或者如果在 iOS 上链接了 UIKit 或在 macOS 上链接了 AppKit 你可以分别获取 UIImage 或 NSImage 要获得 QLThumbnailRepresentation 请将缩略图请求 传递给 QLThumbnailGenerator 如果你只想获得 最佳质量的缩略图 请使用 generateBestRepresentation 它将使用可以创建的 最佳缩略图请求版本调用 完成处理程序 或者你可能更想 通过提供 updateHandler 来获取增量更新 以便生成 灵活的可以调用的表示 例如你可以使用它 来快速更新 UI 然后提高缩略图到达时 所显示内容的质量 这对缩略图检索来说已经足够了 下面我们来谈谈 如何使用快速查看编辑图像 PDF 和视频
快速查看提供了 API 用来预览 iOS 上 各种类型文件的文档 它还允许你通过扩展 为自己的文档 提供自定义预览
现在在 iOS 13 中 我们还添加了使用 QLPreviewController 支持快速编辑图像 PDF 和视频 QLPreviewController 是用来预览文件的 如果只分配一个 QLPreviewController 实例 并在显示前设置数据源和委托 就可以使用了 为了进一步了解快速查看 和 QLPreviewController 我们强烈建议你 查看我们在 2018 年发表的 有关快速查看的 WWDC 演示文稿 对于 iOS 13 的新功能 QLPreviewController 还提供对标记的支持 标记是你在预览文档和文件 或编辑邮件附件时 可用的编辑工具 这适用于图像和 PDF QLPreviewController 还支持修剪和旋转视频 要使用这些功能 只需启用编辑模式 你所要做的就是为预览项 实现可选的 委托方法编辑模式 默认情况下编辑已禁用 但可以基于每个项目启用它 此委托方法允许你 指定是否需要编辑功能 以及如何处理 生成的文件 你可以让 QLPreviewController 使用用户编辑的版本 覆盖原始文件 为此请从预览项的编辑模式 返回 updateContents
如果需要对成功保存的 编辑做出反应 还可以实现可选的 didUpdateContentsof
previewItem 方法 或者你可能更倾向使用 QLPreviewController 来创建正在预览的 文件编辑副本 并自行管理它们 要执行此操作 请从预览项的编辑模式 返回 createCopy 并实施委托方法 在修改后的内容 URL 中 保存预览项目的已编辑副本
macOS 上的快速查看 扩展 API
我们刚刚谈到了 获取和使用 缩略图和文件预览
现在让我们谈谈 如何为你自己的文件类型 提供缩略图和预览 一个 App 在 iOS 上 可以实现快速查看 缩略图和预览扩展 为自己的文档提供 系统范围的缩略图和预览支持 现在 macOS 上也提供了 相同的快速查看扩展 API
缩略图在整个 macOS 和 iOS 中使用 允许用户快速识别文件 例如你可以在屏幕截图中 看到 macOS 如何 在访达中使用它们 macOS 可以为许多常见的 文件类型生成缩略图 实现缩略图扩展允许你 也为自己的文件类型 提供缩略图 以便它们可以在访达 和缩略图可能显示的 其他位置具有丰富的表示形式 扩展 API 取代了旧的 基于 CF 插件的生成器系统 如果你有快速查看生成器 请考虑尽快迁移 我在这里说的快速查看扩展 是一般意义上的 因为缩略图扩展点 来自快速查看缩略图 这是之前从 iOS 上的 快速查看框架中获得的 如果你不需要 UIKit 可能需要考虑 从快速查看缩略图中导入它 因为这将使扩展 更加精简
要创建缩略图扩展 请使用缩略图扩展模板 在 Xcode 项目中添加新目标
设置扩展目标之后 你将能实现 QLThumbnailProvider 子类 你可以使用 CG 上下文 AppKit 上下文绘制缩略图 也可以为图像提供文件 URL
这是一个快速示例 我们覆盖了为请求处理程序方法 提供缩略图 我们在 2017 年 WWDC 的 《Building Great Document-based Apps in iOS 11》 会议中广泛介绍了 快速查看 API 的这一部分 我们强烈建议你们查看一下 简而言之你将获得一个 QLFileThumbnailRequest 它将包含文件的 URL 缩略图的最大和最小尺寸及其比例 使用这些来创建 符合这些规范的缩略图
对于每个缩略图请求 API 希望你创建一个 QLThumbnailReply 用于生成缩略图 将 QLThumbnailReply 传递给上面的完成处理程序块
要在 macOS 上调试缩略图扩展 可使用 QLManage 如果你以前编写过 快速查看生成器 你可能会认识到这个工具 在 Xcode 中构建 并运行扩展目标 以便在系统中注册你的扩展 然后使用 QLManage 生成 文件类型的缩略图 并附加到 Xcode 中的扩展中
预览文件扩展 今年新推出的 macOS 快速查看还允许你通过 实现预览扩展 为自己的文件类型提供预览
快速查看预览扩展 已经存在 以支持聚焦预览 请参阅 WWDC 2017 的 iOS 和 macOS Core Spotlight 中的新功能 今年我们还增加了 对文件预览的支持 使用扩展程序 你现在可以直接提供 显示预览的视图 这与旧的快速查看生成器不同 在这些生成器中 你提供了供系统 显示的数据或 URL 新的扩展 API 可以让你更好地 控制预览的外观 我们建议你从旧的 快速查看生成器中迁移 因为它们在将来的版本中将被弃用
要创建预览扩展 请在项目中添加新目标 然后选择“Quick Look Preview Extension”模板
该 API 与 iOS 预览扩展相同 可以看看看 2018 年的 《Quick Look Previews from the Ground Up》 快速总结一下 你需要在 Info.plist 中的 QLSupportedContentTypes 中 声明支持的 UTI 列表
这必须与要预览的 文件的 UTI 完全匹配 不支持通过父 UTI 进行匹配 该模板将提供一个视图控制器 你可在在其中 准备预览的内容 下面是视图控制器模板的 一个快速示例 在 URL 上执行 preparePreviewofFile 以准备视图控制器 准备好后 调用完成处理程序 显示预览的 QLPreviewView 将显示一个旋转轮 直到调用好 此完成处理程序为止 因此需要尽快 准备好预览
请记住你的预览可以显示在 任何 QLPreviewView 中 可能是预览面板 列视图侧边栏 聚焦搜索或 QLPreviewView 的任何客户端
要进行调试请使用 Xcode 启动扩展目标 注意 Xcode 在默认情况下 将使用快速查看模拟器 这有助于 调试 Core Spotlight 预览 这些预览也是可扩展的 也可以提供支持 要调试常规文件预览 可以忽略模拟器并使用 访达或 QLManage 调用预览 只要预览扩展 通过 Xcode 启动 Xcode 就会自动附加到它
让我们谈谈在 Mac 上 支持 iPad App 我们的文档处理 API 在 Mac 上的 iPad App 中受支持 因此你可以将 基于文档的 iOS App 带到 macOS
对于 UIDocumentPickerViewController 像在 iOS 上那样使用它 用户会自动获得 和体验到 macOS 特有的感觉 具体来说 .import 和 .open 模式显示 NSOpenPanel .exportToService 和 .moveToService 模式显示 NSSavePanel
同样对于 UIDocumentBrowserViewController 用户将获得一种在 macOS 上 基于文档的 App 的 原生体验 用户将在单独的窗口中 获取 NSOpenPanel 就像在 TextEdit 中一样 由于 iOS 和 macOS 上的 接口之间存在差异 因此存在一些小的运行时间差异 一个很好的例子是 UIDocumentBrowserViewControllers 导航栏 它在 macOS 上不存在 有关如何处理 这些特定情况的详细信息 请查看文档 在某些情况下 你可以使用新的 API 例如菜单栏 API 来帮助你解决这些 UI 差异
Mac 上的 iPad App 也可以使用快速查看功能 呈现 QLPreviewController 将在 macOS 上启动 QLPreviewPanel 以提供更原始自然的 Mac 体验 由于 QLPreviewPanel 是一个单独的窗口 因此你呈现的视图控制器 内容将是可见的 但它将是非常棒的 并且不会交互
在 Mac 上测试 iPad App 以确保它看起来很棒
在 Mac 上的 iPad App 中 要注意到 QLPreviewController 的限制 即嵌入 QLPreviewController 的 视图不完全受支持 在这种情况下 我们将提供缩略图 而不是实时预览
我们今天学到了什么 首先我们向你展示了 如何在 App 中 利用 iOS 13 的新功能 例如访问目录中的多个文件 支持 USB 驱动器 和 SMB 服务器 然后我们了解了如何 使用快速查看显示 与文件 App 相同的丰富缩略图 为图像和视频 提供快速查看编辑支持 并在 Mac 上提供 带有现代扩展 API 的 预览和缩略图 谢谢大家
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。