Highlight
iOS 14 让 Core Location 授权从「什么时候能访问位置」扩展到「能访问多精确的位置」,开发者必须同时处理 full 和 reduced 两种精度,并只在功能真正需要时请求临时精确定位。
核心内容
在 iOS 13 里,位置授权主要回答一个问题:App 在什么情况下能访问位置。用户可以拒绝、只允许使用期间访问,或者允许始终访问。这个模型没有回答另一个更敏感的问题:App 是否真的需要知道精确坐标。
本场演讲把这个问题放到具体场景里。约会、本地活动、视频地域限制这类功能,很多时候只需要知道用户大概在哪个城市。导航、跑步记录、离开某个地点时提醒,才需要精确位置。iOS 14 的 Precise 开关把这两类需求拆开,让用户可以授权 reduced accuracy(大致位置)。
这会改变 Core Location 代码的判断方式。以前拿到 authorizedWhenInUse 后,很多 App 默认自己能拿到精确坐标。iOS 14 之后,授权状态和精度状态是两个维度。开发者要解释 UI、后台能力、App Clip、Widget 等不同入口在 reduced accuracy 下还能做什么,什么时候必须升级到 full accuracy。
详细内容
本场没有官方 Code tab 片段。下面只使用 transcript 中明确出现的 API、配置项和行为,不补写代码块。
授权状态变成两个维度
(03:56)CLLocationManager 的授权状态获取方式发生变化。Apple 废弃了旧的类方法,改用一个实例属性表示 App 当前的位置授权状态。与此同时,新的 accuracyAuthorization 实例属性告诉 App 当前拿到的是 full 还是 reduced 精度。
对应的 delegate 也更新了。旧的 didChangeAuthorization 状态回调被新的 locationManagerDidChangeAuthorization 替代。这个回调会在 authorizationStatus 或 accuracyAuthorization 任一值变化时触发。
关键点:
- 不要只看「是否授权」。还要看「精度是否足够」。
- reduced accuracy 的位置仍通过
didUpdateLocations返回,类型仍是CLLocation。 - 返回对象有
CLLocationCoordinate2D中心点和较大的 horizontal accuracy。 - reduced accuracy 位置大约每小时重新计算四次。
- 这个中心点不是用户的真实坐标,只代表包含真实位置的区域中心。
临时请求 full accuracy
(07:21)当用户只给了大致位置,而某个功能确实需要精确位置时,App 有两个选择。一个是把用户送到 Settings,让他们永久打开 Precise。另一个是用 CLLocationManager 的临时 full accuracy 请求方法,在当前使用过程中申请一次精确位置。
Maps 的导航入口是演讲里的例子。浏览地图时,approximate location 足够显示大圆圈。开始从当前位置导航时,Maps 才解释它需要 exact location,然后请求升级。
关键点:
- 临时升级适合一次性任务,例如从当前位置开始导航。
- 请求时必须提供 purpose key。
- 这些说明文案要放在 Info.plist 的
NSLocationTemporaryUsageDescriptionDictionary下。 - Core Location 会按 purpose key 找到对应文案,并把它显示在系统授权提示里。
- 临时升级的生命周期类似 iOS 13 的 Allow Once:用户持续使用 App 时有效,下次重新启动并触发该功能时可能再次询问。
reduced accuracy 对后台定位的影响
(11:22)后台定位并没有一个统一答案。不同 Core Location 能力在 reduced accuracy 下表现不同。
Significant location change monitoring 会适配 reduced accuracy。更新频率不会高于 ordinary location updates,大约每小时四次。Visit monitoring 在时间上仍然准确,空间信息会降低精度。例如 full accuracy App 可能收到「10:08 到达 Apple Park 内某个坐标」,reduced accuracy App 会收到「10:08 到达 Cupertino 内某个坐标」。
Region monitoring 和 beacon monitoring 更严格。没有 full accuracy 时,系统不会给 App 投递 region entry、region exit 或 beacon 相关通知。Reminders 的例子说明了这个差异:离开办公室时提醒这种功能需要持续精确判断区域边界,所以它应当引导用户去 Settings 打开 full accuracy。
关键点:
- 能用 approximate location 完成的功能,不应在启动时强迫用户打开 Precise。
- 依赖 region 或 beacon 的功能需要 full accuracy。
- 需要长期精确定位的后台功能,更适合请求用户永久打开 Precise,而不是临时升级。
主动只请求大致位置
(14:37)有些 App 即使已经拿到 full accuracy,也不该收集精确位置。演讲用 TV App 举例:体育赛事、区域锁定、当地电视台匹配需要位置,但通常只需要大致地区。
Core Location 为这种场景提供了一个新的 CLLocationAccuracy 常量,让 location manager 只请求 reduced accuracy 位置。App 也可以通过 Info.plist 配置,让首次授权时默认请求 reduced accuracy。这样系统提示里不会出现 Precise: On 的切换,避免用户无意间给出更高精度。
关键点:
desiredAccuracy主要用于表达 App 需要多少测量精度,也有省电意义。- reduced accuracy 是隐私授权维度,用户能明确控制 App 拿到多少位置细节。
- reduced accuracy 会把真实位置量化到一个区域里;演讲明确说它不是在真实坐标上添加随机噪声。
- 城市区域的量化半径可能是几公里,较稀疏地区可能达到 10 公里左右,典型值约为 5 公里。
- 量化结果会尽量符合用户对「我大概在哪里」的直觉,例如跨国边界附近会落在用户预期的一侧。
watchOS、Always 授权、activityType、App Clips 和 Widgets
(19:57)reduced accuracy API 适用于 iOS 和 watchOS。配对的 iPhone 与 Apple Watch 会同步 accuracy authorization,就像同步传统位置授权状态一样。Watch connectivity 在这一年也能共享临时授权状态和最终用户状态,例如 watch App 上选择 Allow Once 或临时 full accuracy 升级,phone App 可以受益于这个决定。
(21:14)iOS 13.4 之后,Always 授权路径变得更确定。已经拿到 When In Use 授权的 App,可以在需要 Always 的功能被触发时再请求 Always,并让用户在 App 上下文里立即考虑。演讲明确建议:不要一开始就请求 Always,等用户进入真正需要它的功能再请求。
(22:44)activityType 也要谨慎设置。airborne 只适合真实飞行,fitness 只适合用户明确开始的运动,automotiveNavigation 适合确定在道路上行驶的车辆,otherNavigation 适合越野、徒步、船只、步行等移动场景。找不到明确意图时,才使用其他类型。
(23:41)App Clips 对 Core Location 有两个限制:它们拿不到 Always 授权;系统显示的是 While Using Until Tomorrow,第二天早上会自动清除授权。Widget 则不能显示位置授权提示。使用位置的 widget 要在 Info.plist 中加入 NSWidgetWantsLocation,授权来自 parent app。
关键点:
- watchOS companion app 的临时授权状态会参与同步。
- Always 授权应当由具体功能触发。
- App Clips 不适合放入需要 Always authorization 的位置功能。
- Widget 需要 parent app 负责获取位置授权。
核心启发
-
做一个 approximate-first 的本地推荐页:先用 reduced accuracy 给出城市级内容,例如附近活动、天气或地区规则。这样默认体验不需要精确坐标。入口实现从检查
accuracyAuthorization开始,只有用户进入路线、签到或精确匹配功能时才升级。 -
给地图类 UI 加上精度状态提示:当用户只授权大致位置时,用大圆圈表达范围,并在界面上明确提示当前是 reduced accuracy。Maps 在演讲中采用了这个做法。开始时先把 full 与 reduced 两种 UI 状态画出来,再把
locationManagerDidChangeAuthorization接到状态刷新。 -
把临时精确定位绑定到单个任务:导航、找车、跑步起点校准这类动作适合临时 full accuracy。不要把它做成 App 启动时的全局弹窗。实现入口是任务按钮,触发前检查
accuracyAuthorization,缺少 full accuracy 时用 purpose key 解释原因。 -
审计后台定位功能的精度需求:如果功能依赖 region entry、region exit 或 beacon,直接标记为 full accuracy 需求;如果只是统计用户到访时间或大致地区,优先保留 reduced accuracy 路径。这个审计能减少无谓的 Settings 跳转。
-
为 App Clip 和 Widget 设计独立的位置路径:App Clip 的授权会在次日清除,Widget 不能自己弹授权。App Clip 只放短时、前台、可中断的位置任务;Widget 的位置说明和授权入口放回 parent app。
关联 Session
- Design for location privacy — 从 Maps 的界面设计角度解释 approximate location 应该怎样反馈给用户。
- Build trust through better privacy — 了解 iOS 14 隐私控制的上层原则,包括 approximate location 的产品背景。
- Handle the Limited Photos Library in your app — 对照照片权限的 limited access,理解 iOS 14 如何让用户只授予必要数据。
- Support local network privacy in your app — 继续看 iOS 14 中另一个需要明确说明用途的新权限流程。
评论
GitHub Issues · utterances