iOS 11,应用程序在用户强行杀死时不更新位置

时间:2017-12-12 10:48:32

标签: ios swift3 ios10 core-location 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()
}

在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;更慢"但我根本没有收到更新。

1 个答案:

答案 0 :(得分:1)

我花了很长时间调试这个并试图找到可靠的答案。基本上,后台和前景位置更新按预期工作。现在让我们来看看真正的问题,那就是应用程序的死亡模式(主要是由用户强制使用)。

据我所知,当我通过模拟器测试时,位置更新无法正常工作的原因是因为我测试的距离不够远或者significantLocationChanges依赖的事实关于网络的变化(切换到不同的塔楼或其他东西)。但是,当我使用真实设备测试被杀死的场景并且行进相当远的距离时,我发现结果有所不同,但基本上位置确实更新了,尽管更新从未一致。现在这种一致性可能是因为网络连接不好以及旅行时我也无法确定。

乘车旅行15-20分钟(距离3.8公里),当应用程序被杀时,该位置在一天内被送到服务器4-5次,并且在相同时间内以不同的路线行驶,2-3次。这可能是由于网络状况不佳或网络切换频繁发生的原因。

如果您期望背景和前景级精度/频率,则不可能。目前这是不可能的。

现在,我甚至尝试使用动态地理围栏来监控位置更新,但这有点失败。每次我从操作系统回复用户退出/进入地理围栏设置时,我都会设置一个新的地理围栏。现在这些回调发生了一段时间,但有时他们只是停了下来,整个地理围栏区域被完全跳过,或者如果车辆移动得太快,地理围栏不能为你提供回调,因为我们有条件让这些回叫。更多内容可以阅读here

从以上链接的文档中, “测试iOS应用程序的区域监控支持

  

在iOS模拟器中测试您的区域监控代码时   设备,意识到区域事件可能不会立即发生   区域边界交叉。为了防止虚假通知,iOS   在某个阈值之前不会发送区域通知   条件得到满足。具体来说,用户的位置必须越过   区域边界,离开边界最小距离,   并保持在最小距离之前至少20秒   报告通知具体的阈值距离是   由硬件和定位技术决定   目前可用。例如,如果禁用Wi-Fi,则为区域   监测明显不太准确。但是,用于测试   目的,你可以假设最小距离是近似的   200米。“

基本上,您可以使用startMonitoringSignificantLocationChanges获取位置更新,但准确性和频率不是您可以依赖或估算的。