【问题标题】:Continuous location update background iOS13持续位置更新后台iOS13
【发布时间】:2020-02-06 10:54:07
【问题描述】:

我目前正在 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-methods 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 有关。

【问题讨论】:

  • 嘿,您找到解决方案了吗?
  • 好吧,正如我在上一条评论中所说,通过减少后台消耗的资源,我可以大幅增加应用程序进入挂起状态之前的持续时间。 -> 我从应用程序中完全删除了动作集合。 -> 切换到后台时,我会降低准确性并增加位置的 distanceFilter 以获得更少的事件,我会停止一些更新 UI 的任务,我对其他数据源的集合进行下采样,我不会在后台导出我的数据或其他工作量。所以现在我在后台大约有 3000 分钟。
  • 你能帮我写一些代码吗?
  • 在您的 AppDelegate.swift 中实现 func applicationDidEnterBackground(_ application: UIApplication) 和 func applicationDidEnterBackground(_ application: UIApplication) 函数。在这些函数中访问您的 CLLocationManager 并相应地设置属性 distanceFilter、desiredAccuracy。我还对用于写入一些使用信息(如当前电池状态)的计时器进行了下采样,并在 applicationDidBecomeActive 方法时结束用于定期更新主视图的计时器,反之亦然。我想玩和测试是关键。

标签: ios swift background cllocationmanager cllocation


【解决方案1】:

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

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

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

因此,当用户授予 WhenInUseUsage 权限时,您将在 CLAuthorizationStatus 中获得 always,如果用户选择 Allow Once,则一旦应用再次启动,CLAuthorizationStatus 将被恢复为 notDetermined

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

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

编辑

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

所以现在没有办法像以前那样直接要求用户总是立即允许权限。

【讨论】:

  • 这解决了您的问题吗?我手动将授权级别设置为始终在 -> 设置 -> 隐私 -> 位置服务但这并没有解决问题。
  • 但即使我设置了始终允许标志,应用程序也会在某个时候终止。之后您的应用会持续运行吗?
  • 感谢您的更新。我已经遇到过那个弹出窗口,你也可以在 iphone 隐私设置中设置总是通知,但这并不能解决我上面的问题。在 iOS 12 上,我还没有遇到任何持续位置跟踪的问题,而在 iOS 13 上,应用程序会在一段时间后暂停。
  • 这是我在探索了一段时间后的观察结果。简而言之:我在后台做的越少,我可以录制的时间越长,直到暂停。我禁用了在后台执行的大部分功能,所以现在我只跟踪位置/一些使用信息并使用核心数据存储它。此外,当应用程序进入后台模式时,我更改了位置管理器的 distanceFilter 和 desiredAccuracy。现在,我可以在不被暂停的情况下跟踪大约 3000 个。
  • 有人得到这个解决方案吗?
【解决方案2】:

这是一个 iOS 13 错误。应用程序权限被 iOS 搞砸了。虽然它在设置中显示“始终”,但实际上它的行为更像“使用时”。一个应用程序在后台进入睡眠状态,而其他应用程序继续在同一设备上获取位置(在后台)。

要解决它,请转到设置-> 搜索有问题的应用 -> 位置 -> 将始终更改为从不,然后再返回始终。

不幸的是,没有什么,你可以在代码中解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 2018-03-11
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2016-07-19
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多