地理围栏服务在 Android 10+ 中有哪些新的限制?

解读

面试官问“Android 10+ 地理围栏的新限制”,并不是想听你背官方文档,而是考察三点:

  1. 是否知道国内 ROM 对后台定位的“二次定制”比 AOSP 更激进;
  2. 能否把“系统限制”“厂商限制”“用户体验”拆成不同维度给出应对方案;
  3. 是否具备落地经验:灰度数据、降级策略、合规声明。

一句话:要把“Google 限、厂商限、用户限”都讲到,并给出可落地的代码级或运营级解法。

知识点

  1. Android 10 后台定位权限细分:前台时只能拿到 ACCESS_FINE/COARSE_LOCATION;后台围栏触发必须拿到新权限 ACCESS_BACKGROUND_LOCATION,否则 GeofencingClient 直接抛 SecurityException。
  2. 权限弹窗行为差异:国内 10+ ROM(MIUI 12+、ColorOS 11+、EMUI 11+)把后台定位与“省电策略”绑定,用户点击“仅使用期间允许”后,系统会自动将 App 的“后台定位开关”置为关闭,Geofence 注册成功但永远不会触发。
  3. 电源管理白名单:Android 10 引入 ALLOW_BACKGROUND_ACTIVITY_STARTS 限制,后台围栏事件通过 PendingIntent 唤醒 Service 时,若 targetSDK≥30 且不在白名单,系统会静默丢弃 Intent;国内 ROM 还会叠加“自启动”权限拦截。
  4. 触发频率限制:官方文档未明说,但 AOSP 10+ 对同一 UID 的围栏回调做 2 min 窗口合并;实测国内 ROM 会放大到 5 min,且在高功耗场景(运动状态=STILL)直接暂停监听。
  5. 数据合规:工信部 164 号文要求后台定位必须二次弹窗告知目的,并在隐私政策中列明“围栏营销”场景,否则应用市场审核会被下架。
  6. 定位硬件开关:Android 11 开始,用户长按定位图标可一键关闭“精确位置”,此时 Geofence 依赖的 FusedLocationProvider 只返回 Cell/Wi-Fi 级别坐标,误差>100 m,极易出现“越界不报警”。
  7. 分区存储与共享围栏:Geofence 序列化文件若放在 /sdcard 目录,Android 11+ 默认拒绝访问,导致卸载重装后围栏丢失;需迁移至 Context.getFilesDir() 并通过 MediaStore 权限兼容。
  8. 后台任务对齐:Android 12 引入“位置权限前台服务必须带通知”规则,若使用 JobScheduler 拉活,需要设置 setImportantWhileForeground(true),否则 5 s 内会被系统 kill。

答案

“Android 10+ 的地理围栏限制分三层:系统层、厂商层、合规层。

系统层最核心的是后台定位权限被单独拆出 ACCESS_BACKGROUND_LOCATION,没有它 GeofencingClient.registerGeofences() 直接抛 SecurityException;同时 PendingIntent 唤醒后台 Service 受 Background Activity Launch 限制,targetSDK≥30 时必须加 FLAG_IMMUTABLE 并申请电池白名单,否则围栏事件会被静默丢弃。

厂商层才是国内 App 真正的坑:MIUI、ColorOS、EMUI 把后台定位开关与省电策略绑定,用户选择‘仅使用期间允许’后,系统会自动关闭后台定位,Geofence 能注册但永远不会触发;另外国内 ROM 对围栏回调做了 2–5 min 的窗口合并,且在高功耗场景(手机静止)直接暂停监听,需要引导用户把 App 加入‘自启动’+‘后台高耗电’白名单。

合规层,工信部 164 号文要求后台定位必须二次弹窗说明使用目的,并在隐私政策中列明‘围栏营销’场景,否则应用市场审核会被下架;同时 Android 11 引入的‘精确位置’开关一旦关闭,FusedLocationProvider 只返回 Cell/Wi-Fi 级坐标,围栏半径<100 m 基本失效,需要动态提示用户打开精确位置。

落地时,我会先检测权限三元组:ACCESS_FINE_LOCATION、ACCESS_BACKGROUND_LOCATION、BatteryWhitelist;缺任何一项就降级为前台围栏+通知栏提醒,并通过 WorkManager 周期性补扫,保证关键业务不丢;灰度数据埋点统计‘围栏注册成功率’与‘实际触发率’,低于 85% 就自动扩容半径或切换地理编码围栏,保证线上效果。”

拓展思考

  1. 如果业务必须 50 m 小半径围栏,而用户又拒绝后台定位,能否用“蓝牙 Beacon + 地理围栏”混合方案规避系统限制?请评估功耗与合规风险。
  2. Android 13 引入“必须带前台服务类型 location”的新规,结合折叠屏多窗口生命周期,如何确保折叠展开时前台服务不被系统降级?
  3. 车载场景(Android Automotive)没有 GMS,GeofencingClient 不可用,如何基于 CarService 的 VehicleHAL 实时车速与 GPS 坐标,自己实现一个高可信的围栏引擎?