连续位置更新背景iOS13

时间:2019-10-09 06:44:49

标签: ios swift background cllocationmanager cllocation

我目前正在测试iOS 13中的背景定位模式,因为我想在后台跟踪用户的位置和运动(使用CMMotionManager)。 因此,我有自己的(单例)类来处理位置跟踪。我通过以下方式初始化CLLocationManager:

    func initializeLocationManager() -> CLLocationManager {
        let manager = locationManager ?? CLLocationManager()
        manager.delegate = self
        manager.requestAlwaysAuthorization()
        manager.allowsBackgroundLocationUpdates = true
        manager.pausesLocationUpdatesAutomatically = false
        manager.distanceFilter = kCLDistanceFilterNone
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.activityType = .other
        return manager
    }

然后我启动以下服务:

   func startLocationServices() {
        // ...
        locationManager.startUpdatingLocation()
        locationManager.startMonitoringVisits()
        locationManager.startMonitoringSignificantLocationChanges()
        // ...
    }

此外,我实现了CLLocationManagerDelegate方法didChangeAuthorization(),didUpdateLocation()。

在info.plist文件中,我添加了以下条目:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array> 

在ViewController中,我称为startLocationServices。 目前,我将应用的授权设置为将位置数据跟踪为“ .authorizedAlways”

位置更新将在大约60-130分钟后停止。

要解决该问题,我已经添加了didFinishLaunchingWithOptions-函数,该函数再次触发位置更新:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if let launchOptions = launchOptions,
        let isLocationKey = launchOptions[UIApplication.LaunchOptionsKey.location] as? Bool,
        isLocationKey {
        restartServices()

    }
    return true
} 

使用此功能将应用唤醒后,我设法在一些测试中获得了连续的数据,但有时几分钟后该应用又被暂停了。

最后,我还尝试了一个计时器,该计时器每5分钟重新启动一次位置跟踪,但这似乎根本不影响更新持续时间。

所以我的问题是,是否可以在后台连续接收位置更新,或者我是否缺少某些选择?

谢谢。

编辑:我在iOS 12上测试了该应用程序,并在5/5测试中获得了连续更新。 因此,我认为问题与iOS 13有关。

2 个答案:

答案 0 :(得分:1)

代码没错!! ,  我也遇到过同样的问题,经过研究,我发现

在WWDC19主题演讲中,Apple宣布了位置权限在iOS 13中的工作方式的两项更改。第一个更改使用户可以选择与您的应用共享一次位置。这样可以更轻松地试用位置信息功能,并帮助用户将敏感的位置数据保密。

第一个值得注意的变化是,即使您调用requestAlwaysAuthorization,用户也只会在权限对话框中获得“立即”和“正在使用”选项。如果用户授予您“使用中”权限,并且您尝试在后台扫描位置,则只有该用户才会看到一个对话框,以授予背景权限。

因此,当用户授予 WhenInUseUsage 权限时,您将在always中获得CLAuthorizationStatus,并且如果用户选择Allow Once CLAuthorizationStatus将停留在{{ 1}}一旦应用再次启动

您可以查看此文章以获取详细信息 https://medium.com/q42-engineering/apple-location-permission-ios13-1e0e59002889

这是视频https://developer.apple.com/videos/play/wwdc2019/705/

编辑

用户在授予用户权限后,iOS将在几天后向用户显示另一个对话框,以将权限从使用时间更改为始终允许。

因此,现在没有办法像以前一样直接要求用户立即始终允许许可。

enter image description here

答案 1 :(得分:0)

这是一个iOS 13错误。 iOS弄乱了应用程序的权限。尽管它在设置中显示“始终”,但实际上其行为更像“在使用中”。一个应用程序在后台进入睡眠状态,而其他应用程序则始终在同一设备上(在后台)获得位置。

要解决此问题,请转到“设置”->“在问题中搜索您的应用”->“位置”->“始终”更改为“从不”,然后再返回“始终”。

不幸的是,什么都没有,您可以在代码中进行修复。