gpt4 book ai didi

ios - CLLocationManager 在后台时不更新,并且得到困惑的位置坐标 Swift

转载 作者:行者123 更新时间:2023-11-30 11:12:58 29 4
gpt4 key购买 nike

我有跟踪功能,但它不会在后台更新位置。

第一种情况:应用程序位于前台时进行跟踪 -> 跟踪实际上正在发生,但没有获得精确的坐标。我就改成locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation看看是否可以提高跟踪的准确性。

第二种情况:屏幕关闭时跟踪 -> 跟踪是从 a 到 b 的直线,跟踪不会更新坐标。

第 3 种情况:应用程序在后台时进行跟踪(按下主页按钮)-> 跟踪的情况与情况 1 相同。

我发现一篇文章解释说,如果授权设置为始终,则您必须指定要在后台持续更新位置,但没有任何变化。这是代码和 info.plist :

override func viewDidLoad() {
super.viewDidLoad()


mapView.delegate = self
locationManager.delegate = self
// locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
// locationManager.allowsBackgroundLocationUpdates = true //for getting user location in background mode as well

mapView.showsUserLocation = true
mapView.userTrackingMode = .follow //map following user

configureLocationServices()
addDoubleTap() // enabling duble tap gesture recognizer
// mapView.isUserInteractionEnabled = true

let location = locationManager.location?.coordinate
let region = MKCoordinateRegionMakeWithDistance(location!, 1000, 1000) // set mapView based on user location coordinates
mapView.setRegion(region, animated: true)
centerMapOnLocation()

// alerts coordinates to post to Firebase
let alertDrawLatitude = alertDrawCoordinates?.latitude // not used ?
let alertDrawLomgitude = alertDrawCoordinates?.longitude
let title: String? = alertNotificationType
var subtitle: String? = alertNotificationType

// user alert notification. takes coordinates from alertNotificationArray( populated with firebase returning coordinate for all alerts

displayAlerts()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let mostRecentLocation = locations.last else { return }
self.actualRouteInUseCoordinatesArray.append(mostRecentLocation.coordinate)

}

func configureLocationServices() {
if authorizationStatus == .notDetermined{
locationManager.requestAlwaysAuthorization()
} else if authorizationStatus == .authorizedAlways {
locationManager.showsBackgroundLocationIndicator = true //set update location even if in background. very imposrtant!!
}
}

info.plist

更新:

改变准确度只会让事情变得更糟。

准确度最佳: accuracy best

并具有 AccuracyBestForNAvigation

accuracy best for navigation

第二次跟踪实际上更糟糕......导航应用程序如何依赖这种跟踪?我的 LocationManager 代码有什么问题吗?

第二次更新:现在,它在后台时会更新位置,但位置偏离了。我从未经过黄色街道,它显示我在它之后醒来了 10 分钟。

第三次编辑:

我发现我应该过滤掉 GPS 原始数据,因此我使用了卡尔曼滤波器,它确实使跟踪结果更加平滑。因此,我正在微调两个参数,为了能够更改这些参数,我添加了两个文本字段 @IBOutlet weak var filterValueTextField: UITextField!@IBOutlet weak var horizontalAccuracyTextField: UITextField!并将它们连接到参数

hcKalmanFilter?.rValue = Double(String( describing:filterValueTextField?.text!))!guard mostRecentLocation.horizontalAccuracy < Double(String( describing: horizontalAccuracyTextField?.text!))! else { return } 。我的问题是现在它在展开 Horizo​​ntalAccuracy 参数中的值时发现 nil 。如果在 Horizo​​ntalAccuracy 中我只是输入一个值,它接受一个整数,但是当我从 texField 中取出它并将 textfield.text 转换为 Int 时,编译器会抛出错误 Binary operator '<' cannot be applied to operands of type 'CLLocationAccuracy' (aka 'Double') and 'Int' ,而如果我将其转换为 Double 则不会,但它会发现 nil。为什么 filterValue 从它的 textField 中找到一个值,而水平 Accuracy 却没有?它们的声明和使用方式相同。有什么想法吗?

traking is way off

最佳答案

首先,当您的应用程序进入后台时,您的时间有限,并且该时间取决于设备操作系统上的负载,但很可能大约是。 30秒。因此,这就是您在屏幕关闭或应用程序进入后台时无法获取位置更新的原因。

但是 Apple 允许应用在后台运行某些任务,位置更新就是其中之一,因此即使您的应用进入后台,您也可以通过为应用启用后台获取功能来获取位置更新.

更多详情请关注以下官方文档。苹果公司:

https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/handling_location_events_in_the_background

其次,尝试在应用程序的全局范围内维护您的 locationmanager 对象,就像您可以将其放置在 AppDelegate 或 Singleton 类中(如果您要为应用程序维护任何对象) ,因此它将始终可用。

关于ios - CLLocationManager 在后台时不更新,并且得到困惑的位置坐标 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52006256/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com