Rik*_*ikh 6 core-location ios swift3 ios10 ios11
我正在开发一个需要实时位置跟踪的应用程序,所以我正在使用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()
}
Run Code Online (Sandbox Code Playgroud)
并在应用程序委托:
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])
}
}
}
Run Code Online (Sandbox Code Playgroud)
并在位置代表:
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])
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是iOS 11的一个已知问题,当用户强行杀死时,位置会被破坏吗?当我做了一些挖掘并发现类似的蓝牙问题,但没有重要的位置变化否则.
例如这个链接.
编辑:另外这个关于更新为"慢",但我完全不接收更新帖子会谈.
我花了很长时间调试这个问题并试图找到可靠的答案。基本上,后台和前台位置更新按预期工作。现在让我们来讨论真正的问题,那就是应用程序的终止模式(主要由用户强制执行)。
\n\n据我所知,当我通过模拟器进行测试时,位置更新无法正常工作的原因要么是因为我测试的距离不够远,要么可能是依赖于significantLocationChanges网络变化的事实(切换到不同的塔或其他东西)。但是,当我用真实设备测试被杀死的场景并移动相当长的距离时,我发现结果有所不同,但基本上位置确实更新了,尽管更新从来都不一致。现在这种一致性可能是由于旅行时网络连接不良造成的,但我不能确定。
当开车行驶 15-20 分钟(距离超过 3.8 公里)时,当应用程序被终止时,该位置在一天内会被发送到服务器 4-5 次,而在相同的时间内行驶不同路线时,2- 3次。同样,这可能是由于网络状况不佳或网络切换发生的频率造成的。
\n\n如果您期望背景和前景级别的准确性/频率,那么这是不可能的。目前这是不可能的。
\n\n现在,我什至尝试使用动态地理围栏来监视位置更新,但这有点失败。每当我收到操作系统关于用户退出/进入地理围栏设置的回电时,我都会设置一个新的地理围栏。现在这些回调发生了一段时间,但有时它们只是停止,整个地理围栏区域被完全跳过,或者如果车辆移动太快,地理围栏不会为您提供回调,因为我们有条件获得这些呼叫背。更多内容可以在这里阅读
\n\n从上面链接的文档中,\n“测试 iOS 应用程序\xe2\x80\x99s 区域监控支持
\n\n\n\n\n在 iOS 模拟器或设备上测试区域监控代码时,请意识到区域事件可能不会在跨越区域边界后立即发生。为了防止虚假通知,iOS\n 不会\xe2\x80\x99 传送区域通知,直到满足特定阈值\n 条件。具体来说,用户\xe2\x80\x99s 的位置必须跨越\n 区域边界,离开边界最小距离,\n 并在报告通知之前保持在该最小距离至少 20 秒。具体阈值距离由当前可用的硬件和定位技术确定。例如,如果禁用 Wi-Fi,区域监控的准确度就会显着降低。但是,出于测试目的,您可以假设最小距离约为 200 米。”
\n
基本上,您可以获得位置更新,startMonitoringSignificantLocationChanges但准确性和频率不是您可以依赖或估计的。
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |