我正在开发一个 iOS 应用程序,用户可以将他们的旅行路线保存到服务器(通过 API 发布他们的位置)。我正在努力解决的问题是有几个用户报告说他们保存的路线在旅途中被打断了。具体来说,当用户在地图上查看他们保存的路线时,有一部分路线只是一条直线,因为该路线部分的位置没有发送到服务器,或者只是因为当时设备无法接收位置。奇怪的是,其余的路线记录正常,所以位置服务似乎停止工作了一段时间,但之后又重新开始,所以我的应用程序可以很好地记录它。
而最令人沮丧的是,我无法重现这个问题。
以下是用户报告的问题的情况:
- 用户启动应用程序然后锁定设备屏幕并将其放在口袋里,他们在整个旅程中没有触摸它。没有发生电池耗尽或崩溃。
- 在行驶了大约 8-9 公里后一切正常,路线记录在接下来的 ~ 65 公里中被中断,然后在剩下的 ~ 80 公里中再次记录良好。
以下是我的项目设置:
- 功能中的背景模式处于打开状态,并带有位置更新。
- 从位置服务接收到的位置会根据时间戳和准确性进行过滤,如果位置成功发送到服务器,则使用“isSent”标志标记保存到核心数据中。这样我的应用程序可以覆盖网络连接中断的情况。
- 标有错误“isSent”标志的位置将每 30 秒发送到服务器。
我的 LocationManager 代码:
class LocationManager: NSObject, CLLocationManagerDelegate {
var locationManager: CLLocationManager = {
var _locationManager = CLLocationManager()
_locationManager.delegate = self
_locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
_locationManager.activityType = .automotiveNavigation
_locationManager.allowsBackgroundLocationUpdates = true
_locationManager.pausesLocationUpdatesAutomatically = false
return _locationManager
}()
func startLocationService() {
locationManager.startUpdatingLocation()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
var positionsToSavedToDb: [DbPositionModel] = []
for location in locations {
let howRecent = location.timestamp.timeIntervalSinceNow
guard abs(location.timestamp.timeIntervalSinceNow) < 10 && location.horizontalAccuracy > 0 && location.horizontalAccuracy < 33 else {
continue
}
if self.locations.count > 0 {
let distanceSinceLastLocation = location.distance(from: self.locations.last!)
let timeSinceLastLocation = location.timestamp.timeIntervalSince(self.locations.last!.timestamp)
if (distanceSinceLastLocation < 5 && abs(timeSinceLastLocation) < 10) {
continue
}
}
// Create DbPositionModel from location and append to positionsToSavedToDb
}
// Save positionsToSavedToDb to core data
}
@objc func each30Seconds(_ timer: Timer) {
// Select in database DbPositionModel objects with false “isSent” flag to send to server
}
}
你们能帮我找出我的代码中的黑洞或我能做些什么来重现/解决这个问题吗?非常感谢!!!