我创建了一个简单的应用程序,可以跟踪用户位置,并在每次更新位置时创建本地通知。
我启用了以下后台模式,
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文档中看到时间限制。
答案 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
个案例
在支持GPS设备的设备上,您可以让位置 当您的应用在应用中时,经理会推迟发送位置更新 背景。例如,跟踪用户位置的健身应用程序 在远足径上可以推迟更新,直到用户移动某个 距离或一段时间已经过去。
答案 2 :(得分:0)
我假设你没有实现后台任务。您可以阅读here。
在“实施长时间运行的任务”部分的上述链接中,请点否。 3是您的情况,因此您可以在项目中使用后台位置更新,并且您也需要实现后台任务。
跟踪用户位置有三种方式(根据上面的链接“跟踪用户位置”): -
以下是后台任务的示例,您可以根据自己的要求进行修改,自上次工作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。
它可能对你有帮助。也请查看评论。