You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS定位服务问题:设备锁屏一段时间后无法接收位置更新

CLLocationManager锁屏后台定位异常排查求助

设备信息

  • 设备:iPhone Xs Max
  • 系统:iOS 16.1 beta 4
  • App后台模式:已勾选位置更新

CLLocationManager配置

  • CLAuthorizationStatus:authorizedWhenInUse
  • CLAccuracyAuthorization:fullAccuracy
  • allowsBackgroundLocationUpdates:开启
  • pausesLocationUpdatesAutomatically:关闭(POC中可切换开启)
  • activityType(CLActivityType):.otherNavigation(已尝试其他选项)
  • desiredAccuracy(CLLocationAccuracy):kCLLocationAccuracyNearestTenMeters(用于接收GPS更新而非基站数据)
  • distanceFilter(CLLocationDistance):kCLDistanceFilterNone(-1)或0

问题场景

设备解锁状态下,App无论前台或后台运行均正常,步行时定位精度可达5-15米;但设备锁屏放入口袋一段时间后,位置更新停止,关闭Wi-Fi后现象一致,截图显示速度、航向等数值异常;重新打开App后恢复接收更新,但horizontalAccuracy精度变差,仿佛未使用GPS。

已尝试操作与疑问

已尝试开启/关闭低电量模式,现象似乎无差异,但不确定是否为诱因。据了解低电量模式仅影响网络、后台任务等,不修改定位服务精度,特此求证。

配置代码示例

class LocationDataManager: NSObject, CLLocationManagerDelegate {
    private let locationManager: CLLocationManager = CLLocationManager()
    var activityType: CLActivityType = .automotiveNavigation {
        didSet {
            locationManager.activityType = activityType
        }
    }

    var desiredAccuracy: CLLocationAccuracy = kCLLocationAccuracyBestForNavigation {
        didSet {
            locationManager.desiredAccuracy = desiredAccuracy
        }
    }

    var pausesLocationUpdatesAutomatically: Bool = false {
        didSet {
           locationManager.pausesLocationUpdatesAutomatically = pausesLocationUpdatesAutomatically
        }
    }

    var distanceFilter: CLLocationDistance = kCLDistanceFilterNone {
        didSet {
            locationManager.distanceFilter = distanceFilter
        }
    }

    init() {
        super.init()

        locationManager.delegate = self
        locationManager.activityType = .automotiveNavigation // controlled by the Picker
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation // controlled by the Picker
        locationManager.pausesLocationUpdatesAutomatically = false // controlled by the Toggle
        locationManager.distanceFilter = kCLDistanceFilterNone // controlled by the Picker
        locationManager.allowsBackgroundLocationUpdates = true
    }

    func start() {
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
    }

    func stop() {
        locationManager.stopUpdatingLocation()
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print(error)
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print(locations.last)
   }

   func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) {
        print(#function)
   }

   func locationManagerDidResumeLocationUpdates(_ manager: CLLocationManager) {
        print(#function)
   }
}

内容的提问来源于stack exchange,提问作者alpennec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:25:37