我正在开发一个需要实时位置跟踪的应用程序,所以我使用startMonitoringSignificantLocationChanges
并且即使应用程序已被用户从应用程序强制退出,一切都在我的iOS 10模拟器上运行正常切换器。我在通过模拟器进行调试时也使用了高速公路 - 驱动器选项,以便位置不断变化。
但对于iOS 11模拟器: 当应用程序处于后台或前台模式时,服务器会根据用户的实时位置进行更新,但是当应用程序强行退出时,这不会发生。
服务器没有获取更新的位置,我甚至在didFinishLaunching
中设置了一个断点,并使用wait for executable to be launched
设置来检查我是否收到回拨,但我不知道iOS 11并为iOS 10做。
我还使用iOS 11所需的适当值更新了info.plist,并确认我已经给出了"始终"允许。 我使用代码使用单例作为位置管理器对象:
func setupLocationManager(){
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.allowsBackgroundLocationUpdates = true
locationManager.requestAlwaysAuthorization()
locationManager.distanceFilter = 100.0
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.startMonitoringSignificantLocationChanges()
locationManager.startUpdatingLocation()
}
在app delegate中:
if let _ = launchOptions?[UIApplicationLaunchOptionsKey.location] {
ChatSocketHelper.sharedInstance.socket.on("connect") { data, ack in
if let coordinate = LocationManager.shared.currentLocation?.coordinate{
ChatSocketHelper.sharedInstance.updateLocation([coordinate.longitude, coordinate.latitude])
}
}
}
在位置代表中:
extension LocationManager : CLLocationManagerDelegate{
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let locationObject = locations.last else {return}
//update to closest accuracy
currentLocation = locationObject
if ChatSocketHelper.sharedInstance.socket != nil{
ChatSocketHelper.sharedInstance.updateLocation([locationObject.coordinate.longitude, locationObject.coordinate.latitude])
}
}
}
这是iOS 11的一个已知问题,当用户强行杀死时,位置会被破坏吗?正如我做了一些挖掘并发现类似的蓝牙问题,但对于位置变化没有任何重要意义。
例如this链接。
修改:此外,this个帖子还谈到了更新“#34;更慢"但我根本没有收到更新。
答案 0 :(得分:1)
我花了很长时间调试这个并试图找到可靠的答案。基本上,后台和前景位置更新按预期工作。现在让我们来看看真正的问题,那就是应用程序的死亡模式(主要是由用户强制使用)。
据我所知,当我通过模拟器测试时,位置更新无法正常工作的原因是因为我测试的距离不够远或者significantLocationChanges
依赖的事实关于网络的变化(切换到不同的塔楼或其他东西)。但是,当我使用真实设备测试被杀死的场景并且行进相当远的距离时,我发现结果有所不同,但基本上位置确实更新了,尽管更新从未一致。现在这种一致性可能是因为网络连接不好以及旅行时我也无法确定。
乘车旅行15-20分钟(距离3.8公里),当应用程序被杀时,该位置在一天内被送到服务器4-5次,并且在相同时间内以不同的路线行驶,2-3次。这可能是由于网络状况不佳或网络切换频繁发生的原因。
如果您期望背景和前景级精度/频率,则不可能。目前这是不可能的。
现在,我甚至尝试使用动态地理围栏来监控位置更新,但这有点失败。每次我从操作系统回复用户退出/进入地理围栏设置时,我都会设置一个新的地理围栏。现在这些回调发生了一段时间,但有时他们只是停了下来,整个地理围栏区域被完全跳过,或者如果车辆移动得太快,地理围栏不能为你提供回调,因为我们有条件让这些回叫。更多内容可以阅读here
从以上链接的文档中, “测试iOS应用程序的区域监控支持
在iOS模拟器中测试您的区域监控代码时 设备,意识到区域事件可能不会立即发生 区域边界交叉。为了防止虚假通知,iOS 在某个阈值之前不会发送区域通知 条件得到满足。具体来说,用户的位置必须越过 区域边界,离开边界最小距离, 并保持在最小距离之前至少20秒 报告通知具体的阈值距离是 由硬件和定位技术决定 目前可用。例如,如果禁用Wi-Fi,则为区域 监测明显不太准确。但是,用于测试 目的,你可以假设最小距离是近似的 200米。“
基本上,您可以使用startMonitoringSignificantLocationChanges
获取位置更新,但准确性和频率不是您可以依赖或估算的。