应用程序在后台运行一段时间后,位置跟踪会停止

时间:2017-08-11 14:40:50

标签: ios swift core-location cllocationmanager

我创建了一个简单的应用程序,可以跟踪用户位置,并在每次更新位置时创建本地通知。

我启用了以下后台模式,

enter image description here

let locationManager = CLLocationManager()

open override func viewDidLoad() {
       locationManager.delegate = self;
       locationManager.desiredAccuracy = kCLLocationAccuracyBest;
       locationManager.distanceFilter = 10
       locationManager.allowsBackgroundLocationUpdates = true
       locationManager.startUpdatingLocation()
}

open func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
       let notification = UILocalNotification()
       notification.alertBody = "location updated"
       notification.fireDate = Date()
       UIApplication.shared.scheduleLocalNotification(notification)
}

我为NSLocationAlwaysUsageDescription设置字符串并请求许可。用户授予第一次加载应用时始终使用的权限。

当应用处于前台,当背景仍在工作至少在5-40分钟的时间范围内,这是可以改变的 通过电池或其他打开的应用程序。

问题在于它停止工作的原因,是否预期会继续工作?

我从未在Apple文档中看到时间限制。

5 个答案:

答案 0 :(得分:22)

Switch to significant location updates when the app moves to background. iOS will unload the app if it keep alive in the background indefinitely.

locationManager.pausesLocationUpdatesAutomatically = false

答案 1 :(得分:6)

降低准确度

设置位置管理器对象的desiredAccuracy属性

self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation

您可以使用其中一个CLLocationAccuracy常量

  

重要

     

默认情况下,iOS设备上的标准位置更新以最佳准确度运行。更改这些设置以匹配   你的应用程序的要求。否则,您的应用程序将不必要地浪费   能量。

自动暂停

将位置管理器对象的pausesLocationUpdatesAutomatically属性设置为true

self.locationManager.pausesLocationUpdatesAutomatically = true
  

重要

     

对于具有使用中授权的应用,暂停到位置更新   结束访问位置更改,直到应用程序再次启动和   能够重新启动这些更新。如果您不希望更新位置   完全停止,请考虑禁用此属性并更改位置   应用移动时的准确度为kCLLocationAccuracyThreeKilometers   到后台。这样做可以让您继续接收位置   以电源友好的方式更新。

允许后台更新

将位置管理器对象的allowsBackgroundLocationUpdates属性设置为true

self.locationManager.allowsBackgroundLocationUpdates = true
  

希望在暂停时接收位置更新的应用必须包含   应用程序中的UIBackgroundModes键(具有位置值)   Info.plist文件并将此属性的值设置为true。该   存在具有位置值的UIBackgroundModes键   后台更新所需

指定活动类型

设置activityType属性,让核心位置知道您的应用在指定时间执行的位置活动类型

self.locationManager.activityType = .automotiveNavigation 

您可以使用其中一个CLActivityType个案例

Defer Location Update

  

在支持GPS设备的设备上,您可以让位置   当您的应用在应用中时,经理会推迟发送位置更新   背景。例如,跟踪用户位置的健身应用程序   在远足径上可以推迟更新,直到用户移动某个   距离或一段时间已经过去。

答案 2 :(得分:0)

我假设你没有实现后台任务。您可以阅读here

“实施长时间运行的任务”部分的上述链接中,请点否。 3是您的情况,因此您可以在项目中使用后台位置更新,并且您也需要实现后台任务。

  

跟踪用户位置有三种方式(根据上面的链接“跟踪用户位置”): -

  1. 仅限前台的位置服务(适用于您的情况)
  2. 重要更改位置服务(推荐),但我认为它不适用于您的情况,因为您希望每10米更新一次用户位置,它可以工作约500米,更多请参阅here
  3. 后台位置服务(我认为你正在尝试这个),解决方案是添加后台任务。
  4.   

    以下是后台任务的示例,您可以根据自己的要求进行修改,自上次工作2小时起,它对我有用,我的应用仍在后台更新位置。

      

    在AppDelegate类中,请更新以下功能,然后在后台运行您的应用程序。

    func applicationDidEnterBackground(_ application: UIApplication) {
        application.beginBackgroundTask(withName: "") {}
    }
    

    以下是我的ViewController类

    import UIKit
    import CoreLocation
    
    class ViewController: UIViewController, CLLocationManagerDelegate {
    
        let locationManager = CLLocationManager()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            locationManager.delegate = self;
            locationManager.requestAlwaysAuthorization()
            locationManager.desiredAccuracy = kCLLocationAccuracyBest;
            locationManager.allowsBackgroundLocationUpdates = true
            locationManager.distanceFilter = kCLDistanceFilterNone
    
            Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in
                self.locationManager.startUpdatingLocation()
            }
    
        }
    
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            print("didUpdateLocations \(Date())")
            self.locationManager.stopUpdatingLocation()
        }
    
    }
    

答案 3 :(得分:0)

我遇到了这样的问题:一两个小时后,QT应用程序将停止在后台获取位置事件。

在应用程序委托中,当应用程序进入后台时,我将停止CLLocationManager,将准确度从kCLLocationAccuracyBest降低到kCLLocationAccuracyNearestTenMeters,然后将距离过滤器从“无”增加到50米,然后进行24小时以上的跟踪。

答案 4 :(得分:-2)

您需要在AppDelegate类,启动方法,applicationDidEnterBackground中进行一些更改 和applicationDidBecomeActive方法。

为位置管理器创建一个sharedInstance。

仅供参考,请完成此http://mobileoop.com/getting-location-updates-for-ios-7-and-8-when-the-app-is-killedterminatedsuspended

它可能对你有帮助。也请查看评论。