大多数浏览器和
Developer App 均支持流媒体播放。
-
探索简化位置更新
与 Core Location 一起迈向未来!认识专为 modern Swift concurrency 设计的 CLLocationUpdate 类,并了解它如何简化获取位置更新。我们将向你展示当你的 App 在前台或后台运行时,该类如何与你的 App 一起配合运行,并分享一些最佳实践。
资源
相关视频
WWDC23
-
下载
♪ ♪
Siraj:大家好 我是 Siraj CoreLocation 的一名工程师 感谢观看“探索简化位置更新” 我将为你介绍获取位置的 新 CoreLocation API 让我们开始吧
现在 获取位置更新 就像写这行代码一样简单 很酷!是吧? 这是我们的新 Swift 原生 API 支持开箱即用的 modern Swift concurrency 以获取位置更新 让我们来深入了解一下 我们将从详细描述 新 CLLocationUpdate API 的结构 开始讲起 接着 我会带你了解 如何使用此 API 获取位置更新 然后 我将介绍在后台获取位置更新 所需的步骤 接下来 我会介绍 如何自动暂停和继续更新 由于你 App 的生命周期 通过此 API 来获取更新 所以最后我们将通过 介绍 App 的生命周期来总结 让我们一起来探索 CLocationUpdate API 的结构吧 我们引入了一个新的类 CLLocationUpdate 它有一个名为 liveUpdates 的静态函数 其返回一个 名为 Updates 的异步序列 可对其使用 for/try/await 进行直接迭代 以产生一个 CLLocationUpdate 类型的元素 该元素包含一个 类型为 CLLocation 的位置 和一个名为 isStationary 的布尔标志 用于管理自动暂停和继续 liveUpdates 还消耗 LiveConfiguration 枚举类型的可选参数 现在 让我们进行一些代码演示 看看如何使用 此新 API 获取更新 让我们构建一个基本的 App 该 App 从前台开始位置更新 首先导入 CoreLocation 然后 我们将调用 CLLocationUpdate 类 提供的静态工厂函数 liveUpdates 以获取 Updates 异步序列 可对其使用 for/try/await 进行直接迭代 以在闭包中 获取 CLLocationUpdate 然后通过访问其位置属性获取位置 好的 现在我们的更新已经开始了 如果我们需要停止更新 该怎么办呢? 停止更新就像 退出 for 循环一样简单 还记得 isStationary 吗? 当 isStationary 结果 为 true 时 我们就从 for 循环中退出 自动停止更新 这时 我们不再需要 显式的启动和停止消息 让我们查看一下 CLLocationUpdate API 返回的异步序列 我们可在异步序列上 执行的所有强大操作 比如查找、选择和排除元素 也可在该更新序列上执行 在本例中 我将向你演示 如何直接在异步序列上 使用第一个过滤器 后台更新已开始 并对每个元素的位置进行速度检测 一旦发现速度超过 200 的更新 将返回第一个元素 操作就完成了 找到第一个匹配后 更新将自动停止 但你注意到这里的速度了吗? 这是每秒 200 米 大约 447 英里每小时 太快了 对吧? 因此在使用这些过滤器时 我们要谨慎一点 这是因为如果没有 找到匹配项 执行会卡住 如果你尝试使用其过滤 基于 horizontalAccuracy 的位置 则需要更加谨慎 好的 这是我们 上一页获取更新的示例代码 其中 我们没有为 liveUpdates 指定任何配置 因此它们会自动配置默认配置 但是 liveUpdates API 可以带有一个显式配置 此配置是一个新的枚举类型 我们将此配置 作为该 API 的一部分引入 让我们来看看 此枚举类型的 member 及其使用 LiveConfiguration 枚举 是一组预设配置集合 App 可从中进行选择以启动更新 它的 member 包括 default、 automotiveNavigation、 otherNavigation、 fitness 和 airborne 如果你的 App 已使用 特定的 CLActivityType 和现有的位置更新 API 则你可选择相应的 LiveConfiguration 成员 以便在采用新 API 时 获得相同的位置体验 但如果你不需要 特定的 activityType 则可以使用默认配置 或根本不指定任何配置 来启动更新 那么这个“updates” 异步序列会产生什么呢? 当你对其进行迭代时 它会给你一个 CLLocationUpdate 类型的对象 它包含一个 CLLocation 类型的可选位置 如无可用位置 我们会提供一个 位置标记为 nil 的更新 该更新中还包含一个 名为 isStationary 的布尔属性 我们可以通过该属性 管理位置更新的自动暂停 / 继续 好的 我们刚才介绍了 如何从前台获取更新 现在 我们来谈谈当你的 App 在后台运行时如何获取更新 LiveActivity 是启用 后台位置更新的最佳方法 只要你的 LiveActivity 保持活动状态 你的 App 就可以接收更新 而无需进行任何其他设置 如果你的 App 还没有 LiveActivity 你也无需担心 这并不会阻止你采用新的 API 相反 你可以使用 CLBackgroundActivitySession 让我们来探索其工作原理 大多数人对这个蓝色后台位置指示器 可能已经很熟悉了 当一个被授权为“当使用 App 时”的 App 在后台获取更新时 该位置指示器就会显示 CLBackgroundActivitySession 使用相同的指示器 为你的 App 提供后台位置功能 其原理是它让用户可以一直看到 正在后台使用的位置服务 正是因为此 App 可以保持有效使用状态 即使从后台也能访问位置信息 CLBackgroundActivitySession 支持 App 的整体授权 所以你的 App 不仅可以 在后台接收更新 还可以使用 CLMonitor 监听事件 BackgroundActivitySession 不依赖于启动 Updates 当你的 App 在后台运行时 只需创建会话 即可显示指示器 并让其按需接收更新和事件 为了使用 CLBackgroundActivitySession 你需要将其实例化并持有它 请谨慎对待持有方面的事项 因为对象释放将会使会话自动失效 这可能会终止 你的 App 对后台位置的访问 你的 App 仍需在其 UIBackgroundModes 数组中拥有位置 以便 BackgroundActivitySession 能有效运作 如你没有未完成的会话 那么你必须从前台 开启新会话 但你只能从后台重新加入现有会话 让我们快速浏览一下代码 看看如何使用 backgroundActivitySession 这是和上一节中相同的 “如何获得更新”代码页
在开始更新之前 你应该实例化 一个 CLBackgroundActivitySession 对象 以启动新会话 请注意 我们正在将会话分配给 self.backgroundActivity 这是一个属性而非局部变量 这点很重要 因为如果我们使用了局部变量 那么当其超出范围时 其所持有的对象将被释放 这会使会话无效并可能 会终止你的 App 对位置的访问 然后 当我们想要结束会话时 我们可以发送无效信息 或销毁对象 无论是通过 LiveActivity 还是 CLBackgroundActivitySession 你的 App 都是 以这种方式在后台获取更新的 现在让我们看看 这个新 API 如何通过 自动暂停和继续更新 来延长电池续航时间 假设用户在移动时 App 正在接收更新 但在一天中 设备将会多次处于静止状态 比如 当用户到达办公室时 他们可能会把设备留在桌子上 在此情况下 我们会反复地 给你的 App 提供相同的位置
反之 我们可以 通过暂停更新来提高能效 不再让你的 App 处理多余的位置信息 也可以减轻 App 负荷 因此 一旦设备 在足够长的时间内处于静止状态 CLLocationUpdate API 将识别此情况 并触发自动暂停 当暂停被触发 我们将发送一个更新 该更新包含一个 non-nil 位置 和值为 True 的 isStationary 标记 这样你就可知道用户已停止移动 而不是让他们位置变成不可用 稍后 当设备变成非静止时 更新将自动继续 而无需任何用户交互 随着更新继续 我们将发送 标记为 False 的 isStationary 继续向你的 App 传递更新 因此 当你的 App 在后台运行时 自动暂停和继续更新 会对 App 的生命周期产生影响 让我们了解一下 你的 App 在后台运行时 将经历的各生命周期阶段 以及保持后台更新连续性 需要采取的措施 你的 App 在前台运行并接收更新时 可能会从前台运行状态 转换为后台运行状态 反之亦然 但现在有了这个新的 API 你的 App 有时可能会 从后台运行状态转换为暂停状态 当无更新可提供时 这种情况就有可能发生 比如 由于自动暂停 设备静止 或位置服务无法计算定位 但不用担心! CLLocationUpdate 不会让你的 App 处于暂停状态 相反 只要有更新可用 不管是因为自动继续启动 还是因为位置现在可用 我们都会取消暂停你的 App 将其转回后台运行状态 当你的 App 从暂停状态恢复时 无需任何操作 你的 App 将继续后台更新 暂停不是唯一的状态 你的 App 可能 会从暂停状态转为终止状态 并且有多种转换方式 让我们来看一看 首先 出现以下情况 你的 App 会直接从后台运行转换: 资源受限时 App 崩溃、用户关闭或系统终止 其次 由于用户关闭或资源受限 你的 App 甚至可以 从暂停状态转为终止状态 但是我们有一个好消息要告诉你 在大多数情况下 我们的 API 都可以恢复你的 App 即便是在你的 App 已被终止 且根本没有运行的情况下 一旦位置更新可用 我们将在后台启动 以恢复你的 App 这将使你的 App 从终止状态转为后台运行状态 但在接收到启动命令后 你需要执行一些步骤 来确保你的后台位置会话可以继续
你需要调用 liveUpdates 以重启更新 如果你的 App 之前使用了后台活动会话 你还需要重建一个 CLBackgroundActivitySession 我之前提到过 你只能从后台 重新加入一个现有的 CLBackgroundActivitySession 但能不能启动一个新的会话呢? 下面是关于此问题的更多解释 你刚刚重建的后台活动会话对象? 它不是一个新会话的开始 你刚刚创建了一个新的会话对象 现在 由于你的 App 在终止之前已经启动了一个会话 这个重建允许你的 App 从后台重新加入该现有会话 这样 你的 App 就能 继续其后台位置更新 好的 我们刚刚讨论了 在接收到后台 App 启动后 你应该如何重建 liveUpdates 和后台活动会话 这里有一些 与重建相关的事项你应该注意
你的 App 在接收到后台 App 启动后 应该立即执行重建 你的 App 接收到后台启动时 请将这些对象的重建 放在某个被执行的地方 对于我们的示例 App 而言 我们已将重建放在 UIApplicationDelegate 的 -didFinishLaunchingWithOptions 中 该方法 在 App 启动完成后被调用 好啦! 这就是我们的新位置更新 API 采用程序更简便 电池性能更优越 从今年开始 所有平台都将提供该 API 我强烈鼓励你在 App 中 试用 CLLocationUpdate 并通过反馈助理 向我们提供宝贵的反馈意见 我们还有一个展示 如何使用这个新 API 的示例 App 你可从资源部分进行下载 CLLocationUpdate 的 Apple Developer 文档 还为你提供更多的 API 详细信息 我还建议你观看我们的 “认识 Core Location Monitor”讲座 该讲座介绍了我们今年 添加的 Core Location Monitor API 以上就是我对 “探索简化位置更新”的全部介绍 感谢你的观看! ♪ ♪
-
-
0:26 - Getting location updates is easy!
for try await update in CLLocationUpdate.liveUpdates() { print("My current location : \(update.location)") }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。