大多数浏览器和
Developer App 均支持流媒体播放。
-
打造出色的锁定屏幕相机拍摄体验
了解 LockedCameraCapture API 如何帮你将拍摄应用程序最有用的信息直接整合到锁定屏幕。研究这个 API 的特性和功能,了解如何开始构建拍摄扩展,并探索此扩展在设备锁定时的运行情况。
章节
- 0:00 - Introduction
- 1:39 - Great capture experiences
- 3:33 - Lifecycle of a capture extension
- 4:49 - Running on a locked device
- 10:48 - Capturing from the Lock Screen
- 18:31 - Working with captures in your app
资源
- Creating a camera experience for the Lock Screen
- Creating controls to perform actions across the system
- Forum: Photos & Camera
- Human Interface Guidelines: Controls
相关视频
WWDC24
-
下载
大家好 我是 Adam 是 iOS System Experience 团队的工程师 今天 很高兴向大家介绍如何 为锁定屏幕打造出色的 相机拍摄体验 我喜欢用 iPhone 记录精彩瞬间 简单又方便 只要从口袋中拿出 iPhone 甚至无需解锁 就可以通过操作按钮、 控制中心或锁定屏幕 启动相机 转眼间我就抓拍了一张精彩照片 今天的这张照片就是 在 Apple Park 抓拍的 利用 iOS 18 的新功能 在 iPhone 和 iPad 的 锁定屏幕上就能直接使用相机 这种拍摄体验得益于 我们在 iOS 18 中 推出的一个新框架 即 LockedCameraCapture 框架 LockedCameraCapture 框架 包含构建块 用于打造从锁定屏幕开始的出色 相机拍摄体验 LockedCameraCapture 引入的 一个主要组件是 一种新的扩展类型 即 Locked Camera Capture Extension 这是打造这种拍摄体验的关键
在本讲座中 我们将讨论是什么 成就了出色的相机拍摄体验 然后我们将带大家了解 拍摄扩展的生命周期 接下来 我们将谈谈在锁定设备上 运行时的 一些重要注意事项 之后 我们将深入探讨 如何从锁定屏幕拍摄精彩的 照片和视频 最后 我们将探讨如何将 从锁定屏幕拍摄的 内容整合到你的应用程序中
我们先来讨论一下 是什么成就了出色的拍摄体验 iOS 上的“相机”App 在 iPhone 或 iPad 上提供了 出色的拍摄体验 我可以从锁定屏幕快速 轻松地访问相机 即使设备处于锁定状态 也可以按下相机控件来访问相机 按下这个控件后 就可以直接 进入取景器 开始拍摄照片
我可以按下调高音量按钮拍摄照片 或按住这个按钮开始录制视频
拍摄完照片或视频后 我可以轻点图像进行查看 我的设备仍然处于锁定状态 而相机只会显示我在 拍摄过程中拍摄的 照片和视频 从而保护我的隐私 如果我想与内容进行更深入的互动 我的手机会要求我解锁设备 然后我才能继续 要为你的 App 启用这种体验 可以创建一种新的 App 扩展类型 即 Locked Camera Capture Extension App 扩展是嵌入到 应用程序中的单独目标 利用这种扩展 可将自定功能 和内容扩展到 App 以外 方便用户 在与其他 App 或系统 进行交互时使用 这种新型 App 扩展 在锁定屏幕上运行 因此你可打造一种便捷的拍摄体验 让用户能使用你的应用程序中 同样熟悉的 UI 快速轻松地 抓拍照片或录制视频 即使设备处于锁定状态也无妨
让我们来看看这个新扩展的生命周期 生命周期的第一步是启动扩展 要启动这个扩展 可使用 控制中心中的控件、 分配给操作按钮的控件 或者锁定屏幕上的控件
启动这个扩展后 就可以开始拍摄 精彩的照片和视频内容 使用的是与你 App 中相同且 令人熟悉的 UI 拍摄扩展可直接将照片和 和视频素材添加到个人的照片图库 也可以将进行拍摄所需的任何数据 存储到文件系统上的指定目录中 拍摄一些内容之后 用户可能想对这些内容进行 更深入的处理 比如分享到社交网络或 为图像素材应用滤镜 来换种图像风格 对于这些类型的交互 扩展可以请求打开它的父应用程序 以对使用设备的人员进行身份验证 这样就能实现 从扩展到 App 的无缝转换 让用户直接跳转到扩展离开的位置 最后 无论是转换到应用程序 还是向上轻扫返回到锁定屏幕 都可退出拍摄扩展 退出后 系统会将拍摄到的内容移动到 一个可供父应用程序访问的位置 当 App 运行时 可将在扩展中 拍摄的内容合并到其他内容中 我们将在本视频的后面 更深入地讨论这一过程 现在我们对拍摄扩展的生命周期 有了更多了解 接下来我们了解一下在锁定设备上 运行时的一些重要注意事项 iOS 每天都为世界各地的用户 提供高度的隐私保护 当设备处于锁定状态时 我的通讯录、 电子邮件、照片、视频等内容 在锁定屏幕的保护下安全无虞 让我尽可放心 只有解锁设备后才能访问这些内容 在构建 LockedCameraCapture 框架时 我们有意将重点放在安全和隐私上 并始终注意保护用户设备中的内容 由于这种新型扩展 是从锁定屏幕运行的 因此通过这种拍摄体验拍摄照片 或视频时 用户设备 可能会被锁定 为确保个人设备的隐私和安全 我们对这种新体验实施了一些限制 这个扩展应提供与应用程序相同的 拍摄体验 并且在启动后应尽快为用户提供 相机取景器 如果扩展在启动时 没有显示相机取景器 扩展将被系统终止 我们认为 使用手机的 硬件按钮拍摄照片或视频 是为用户提供最快捷 拍摄体验的绝佳方式 因此 扩展必须使用 AVCaptureEventInteraction 处理来自系统硬件按钮的事件 由于这种体验是在设备 处于锁定状态时进行的 因此拍摄扩展将受到限制 无法使用任何网络资源 无法读取或写入应用程序的 任何共享组容器 或其他扩展 也无法访问应用程序的 任何共享偏好设置
请放心 你仍然可以 在扩展和应用程序之间 共享重要的状态 稍后我们将介绍如何共享 首先 我们来看看在扩展中如何 持久保留拍摄的数据 我们建议使用 PhotoKit 来保存通过扩展拍摄的 照片和视频素材 使用 PhotoKit 你的扩展可以将拍摄的照片和视频 添加到用户的照片图库 即使设备处于锁定状态也无妨 PhotoKit 旨在设备锁定时保护 照片图库中的私人照片和视频 在锁定的设备上读取照片图库时 只有当前拍摄会话中 写入的照片和视频 才可供读取 如果设备已解锁并且你的扩展 拥有相应的照片图库权限 你就可以读取用户允许你访问的 所有照片和视频 而不仅仅是当前拍摄会话中 拍摄的照片和视频 PhotoKit 还针对 照片图库的细粒度级别访问提供了强大的支持 例如只写访问和有限的照片图库支持 允许用户选择一组照片授予访问权限 扩展会从 App 继承照片权限 因此 扩展应准备好 处理任何级别的照片图库访问权限 如果扩展需要照片的额外权限 你可以转换到 应用程序来请求这些权限 我们将在本视频的 稍后部分介绍如何操作 如需进一步了解 如何使用 PhotoKit 你可以观看往年 WWDC 的这些视频 一些拍摄体验可能需要保存 PhotoKit 不支持的其他数据 LockedCameraCapture 框架还支持 保存在扩展中进行拍摄 所需的任何数据 我们来看看具体怎么操作 这些方框代表照片和视频在文件系统中的存储情况 左边是扩展拍摄的照片和视频 右边是应用程序拍摄的 启动时 通过会话对象 为扩展提供一条内容路径 在本示例中 当用户拍摄内容时 扩展可以将数据 写入提供的会话内容目录 你还可以使用 PhotoKit 来获取拍摄的照片和视频 将它们直接添加到照片图库中
你可能想在扩展容器的其他地方 存储其他数据 但是 不建议这么做 任何时候 用户都可以退出你的扩展 一旦退出扩展 所提供的会话内容目录将 迁移到应用程序的容器中 且扩展的容器将被抹掉以确保安全 并保护设备所有者的隐私 你将无法从扩展中访问 任何先前会话中的内容 对于你希望在给定会话结束后 持久保留的任何数据 请将它们保存在会话内容目录中 在意外终止的情况下 系统仍会拷贝 这个目录的内容 以便你 尝试恢复数据 如果用户再次启动你的扩展 则会收到一个新的会话对象 其中包含一个新的会话 内容目录供写入文件 扩展会再次向会话内容目录进行写入 退出扩展时 内容会再次 作为单独的会话内容目录 移入应用程序的容器中 当应用程序运行时 它可以检索拍摄的内容 并对这些内容进行适当处理 例如将它们与 App 中拍摄的 其他内容整合在一起 在应用程序处理完 单个会话目录的内容后 就可以通过调用使这个目录失效 让系统知道这个目录可以 从文件系统中安全抹掉 重申一下 用户可随时退出你的扩展 退出时 只有会话内容目录中的内容 会拷贝到你的应用程序容器中 下次启动扩展时 你将无法 访问上次启动扩展所产生的容器内容 因为扩展容器中的数据将被抹掉 我们主要关注设备锁定时的运行行为 你的扩展将从锁定屏幕运行 无论设备处于何种锁定状态 对于锁定和未锁定情况 行为和限制 将保持不变 我们已经讨论了在锁定设备上 运行的注意事项 接下来我们谈谈如何构建这种体验 以便直接从锁定屏幕拍摄内容 我和同事 Jon 最近正在更新 我们的 ClownTown App 让小丑可以为自己添加个人资料 这样他们就可以与 相应地区的其他小丑建立联系 我认为 为他们的个人资料 拍摄一张照片 是一项很棒的功能 我将以 ClownTown App 的更新为例 介绍我们如何构建拍摄扩展 以及拍摄体验的其余部分 为帮助你入门 Xcode 提供了一个方便的模板 可用于 Locked Camera Capture Extension 这个模板包含完成 构建并立即运行所需的一切 其中包括相机取景器和快门按钮 在这个示例中 我定义了一个扩展 它遵从 LockedCameraCaptureExtension 结构 然后在这个结构中 为主体实现一个扩展场景 这个场景会返回我的自定视图内容 这个扩展的 UI 应侧重于 向用户显示相机取景器 来拍摄照片和视频 你的扩展还应提供与应用程序相同且 一致的拍摄体验 并使用同样熟悉的 UI 元素 你的扩展将从应用程序继承 相机和照片的 访问权限 你的扩展应能够处理任何级别的 相机或照片访问权限 如果你的 App 因未被授予权限 而无法使用相机 系统将请求解锁用户设备 并在身份认证成功后 启动你的 App 而不是扩展 来处理这种情况 LockedCameraCaptureUIScene 的 构造器 提供一个参数 即 LockedCameraCaptureSession 的实例 我们来看看 这个会话对象提供了什么
这个会话对象有几个重要的作用 拍摄会话提供了sessionContentURL 这是扩展容器中某一目录的路径 可用来持久保留用户拍摄的 照片和视频的所有数据 以及你希望保存的任何其他相关数据 你还可以将拍摄的照片和视频 直接从拍摄扩展 持久保留到 PhotoKit 即使设备已锁定 你也可以向照片图库中写入内容 但是 当设备锁定时 只有当前拍摄会话中 写入的照片和视频 才可供读取 解锁后 你的扩展可以读取所有 有权读取的照片 包括当前拍摄会话以外的照片 如果你写入目录 sessionContentURL 的数据 已使用完毕 例如 你已将内容保存到 PhotoKit 你可以调用 invalidateSessionContent 来抹掉这个目录的内容 调用这个函数后 你可以继续向 目录写入内容 但在调用 invalidate 之前写入的任何内容都将被抹掉 会话还提供一个用于请求 打开你应用程序的函数 这个函数只有在 用户与你的 UI 交互时才需要调用 例如 当用户轻点某一按钮 以通过共享表单共享照片时 由于共享内容需要访问网络 而你无法在拍摄扩展中满足这一请求 因此你可以调用 openApplication 这将提示解锁设备 如果成功解锁 就会打开你的应用程序 在本视频的后面 我们将进一步了解如何使用这个函数 在前面讨论扩展的生命周期时 我提到过启动扩展的方式包括使用 控制中心中的控件、 设置为操作按钮的控件 或锁定屏幕上的控件 要允许用户启动你的拍摄体验 你需要创建一个自定控件 这个控件将是另一个扩展的一部分 即一个可使用 WidgetKit 构建的 小组件扩展 要让这个控件专用于 启动你的拍摄体验 你需要实现 iOS 18 中引入的一种 新的系统意图 即 CameraCaptureIntent 根据设备处于锁定屏幕 还是主屏幕等情况 系统将决定是 使用 CameraCaptureIntent 启动 你的拍摄扩展还是启动你的应用程序 当你的 App 或扩展 通过这个意图启动时 就意味着应将用户直接 带入启动时的拍摄体验中 要允许这个意图启动 你的扩展或应用程序 必须在所有三个目标中 都包含 CameraCaptureIntent 这三个目标分别是小组件扩展 (允许意图供控件使用)、 你的扩展以及你的应用程序
相机拍摄意图定义了 App 上下文 这个上下文在 你的应用程序和扩展之间共享 并且可以从应用程序或扩展中写入 你应该使用这个上下文 来存储用户偏好设置 或任何要在扩展中的拍摄体验 与应用程序中的 拍摄体验之间共享的设置 例如 你可以存储数据 以代表用户在你的应用程序中 进行的 App 购买 以便这些数据也可以 在拍摄扩展中使用 要更新 App 上下文 请调用 updateAppContext 函数 传入你希望持久保留的新 App 上下文 需要注意的是 App 的上下文大小是有限制的 如果上下文过大 就无法持久保留 这可能会影响拍摄体验的行为 因此 请注意向 App 上下文写入的内容量 这里显示了 CameraCaptureIntent 的实现情况 你会发现我为 App 上下文 定义了自己的类型ClownTownContext 这里显示了这个上下文的具体内容 小丑可能并不会时刻准备着 拍摄精彩的小丑肖像画 因为他们并没有时刻化着妆 因此 我们提供一个按钮 以自动为任何人添加一些小丑妆容 这样 他们就可以随时拍摄 完美的小丑个人资料照片 在这里 我定义了一个 bool 来表示 有关是否添加小丑妆容 和小丑鼻子的设置 我已经为我的意图 实现了 perform 函数 大家可以在这里看到这个函数 请注意我如何读取上下文并 用来设置我的界面状态 以便我的拍摄体验 始终反映用户使用 App 时的 最新状态 即是否化了小丑妆 这里是我的拍摄体验中的 按钮代码片段 展示了我如何处理按下按钮 来打开或关闭小丑妆容设置 触发操作时 我会调用这个设置来 更新 App 上下文 以便 App 和扩展都能读取这个设置 最后 这是我为 ClownTown 设计的控制小组件 它将整合到我的小组件扩展中 你可以看到 我将 ClownTownCaptureIntent 的实例 作为要执行的操作传递给控件
总而言之 你将在 App 中添加 小组件扩展 并定义控件 与此同时 你还将实现相机拍摄意图 以提供给你的控件 并将这个意图包含在 App 和扩展目标中 有关如何构建控件以启动拍摄体验的 更多信息 你可以观看我同事 Cliff 的视频 “创建自己的控件” 有关使用 AppIntents 的更多信息 你可以观看 “利用 App Intents 为用户 奉上 App 的核心功能” 拍摄体验的最后一个要求是 你的扩展和应用程序 都应包含相机的隐私使用说明 这是向系统表明你打算使用相机 拍摄照片和视频 并允许系统显示这一说明 以解释你的拍摄体验 为什么希望使用相机 现在 我们已经构建了一个控件 来启动拍摄体验 接下来我们谈谈如何在 App 中 使用拍摄的内容 在锁定屏幕上运行拍摄体验时 用户想要执行的某项操作 所需的权限可能超出 拍摄体验提供的权限 例如 用户可能希望将拍摄的 照片发布到社交网络 而这需要网络访问权限 或者用户希望使用的 某项功能可能需要 应用程序共享组容器中的资源 要处理这些类型的交互 你的扩展可以调用 LockedCameraCaptureSession 上的 openApplication 函数 我们在前面曾简要介绍过这个函数 这个函数接受 NSUserActivity 的 单一参数 为方便起见 LockedCameraCapture 还公开 一个新的 NSUserActivity 类型 NSUserActivityType LockedCameraCapture 这个新的用户活动类型旨在 与 openApplication 函数配合使用 作为信号 向你的应用程序表明 它是从你的拍摄扩展启动的 调用 openApplication 函数 将提示用户在需要时解锁设备 并打开你的应用程序以接收一个调用 来处理 NSUserActivity 的延续 这样 你的应用程序就可以让用户 跳转到 UI 中离开的位置 以实现无缝转换
对于我的 ClownTown 拍摄扩展 我想在用户想要更新 个人资料照片时打开 App 这将使用网络将照片发送到服务器 在这里 当用户轻点相应的按钮时 我会调用 NSUserActivity 来打开应用程序 调用时使用的是 LockedCameraCapture 的新类型 并在 userInfo 中传递一些上下文 以表明我希望我的应用程序 继续“更新个人资料照片”流程 有了 userInfo 以及用户活动类型 我的应用程序将有足够的上下文 来执行与扩展的 无缝转换 在你的应用程序中 你可以 使用 LockedCameraCaptureManager 处理从拍摄扩展拍摄到的 内容 LockedCameraCaptureManager 公开了一个共享实例 以便你根据需要在应用程序中使用 这个管理器公开了一个 sessionContentURLs 属性 这个属性会提供一系列 URL 每个 URL 都指向在拍摄扩展中 拍摄的内容所属的目录 这个管理器还公开了一个 AsyncSequence of sessionContentUpdates 这个序列开头的 URL 代表当前的会话内容目录 然后是任何已添加 或已移除的会话内容目录 这可用于异步处理从扩展拍摄的内容 在某些情况下 当从扩展转换到应用程序时 最近拍摄的会话内容目录 可能会在应用程序启动后立即可用 建议使用这个异步序列 以确保你可以在会话内容可用时 立即进行处理 最后 这个管理器还公开了 一个 invalidate 函数 这个函数的调用场合是 给定 URL 的会话内容已处理完毕 并且不再需要相应的会话内容 调用这个函数将删除 所提供的 URL 的会话内容 因此 务必确保完全处理完 会话内容后才调用这个函数 请注意 在使给定 URL 的 会话内容无效的同时 还会导致会话内容更新 以删除会话内容目录 在我的 ClownTown App 中 我可以使用 sessionContentUpdates 属性 来处理最初的现有拍摄内容 等待新的会话内容 以及在我的应用程序中处理 收到的内容
LockedCameraCapture 提供了 所需的所有组件 来打造出色的拍摄体验 并可在用户的锁定屏幕上轻松访问 你可以转换到你的 App 来完成需要额外访问权限的 关键工作流程 同时保护从锁定屏幕 拍摄视频和照片时 应享有的隐私和安全性
我们非常期待看到你创造的精彩体验 感谢观看
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。