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
相关产品推荐
相关产品推荐

