设置XCUIDevice位置为nil无效,CLLocationManager初始位置非nil问题
你的UI测试中设置设备位置为nil后,被测应用的LocationManager.shared.location仍不为nil,同时出现kCLErrorDomain error 0错误,可能由以下原因导致:
1. 单例初始化时机过早
你的LocationManager是static let单例,会在第一次被访问时自动初始化。如果应用启动流程中(比如AppDelegate、SceneDelegate或某个提前加载的视图控制器),在UI测试设置device.location = nil之前就已经访问了LocationManager.shared,此时CLLocationManager已经开始请求位置,拿到的是重置前的模拟位置或系统缓存位置,后续的位置重置无法覆盖这个初始值。
2. CLLocationManager的缓存机制
CLLocationManager默认会缓存设备最后已知的位置。即使你在UI测试中重置位置为nil,当应用启动后初始化CLLocationManager时,它会先返回缓存的位置数据,再尝试获取新位置——此时因为位置被设为none,触发kCLErrorDomain error 0(位置未知错误),但缓存的location值依然存在,导致LocationManager.shared.location != nil。
3. 位置重置的时机与应用启动的时序问题
在setUp中先执行device.location = nil再启动应用,可能存在系统处理位置重置的延迟。应用启动速度快于位置重置的生效速度,导致应用初始化CLLocationManager时,系统的位置模拟还未切换到none状态,从而获取到了之前的位置值。
4. 权限请求与位置重置的冲突
如果应用在启动时立即请求位置权限(如requestWhenInUseAuthorization),权限请求的流程可能早于位置重置的生效时机。此时系统可能会返回最后已知的位置作为临时结果,之后才触发错误回调,导致location属性保留了缓存值。
内容的提问来源于stack exchange,提问作者Reinhard Männer

