与此问题相关的应用旨在以高精度跟踪用户位置,包括 GPS 坐标和加速度计读数,持续 30 分钟,即使用户按下了 sleep 按钮也是如此。
为此,plist 文件和应用程序功能设置已更改,以反射(reflect)始终打开导航访问的原因,并启用后台进程以提供基于位置的服务。
该应用程序在运行时会询问用户 GPS 权限,如果他们被授予,则此 View Controller (包含以下代码的 View Controller )的激活会导致 GPS/导航图标显示在iPhone。
问题是,到目前为止,下面看到的四个“print”命令都没有产生任何打印消息,因此“newLocation”和“myLocation”变量都没有产生任何数据。如果此代码与第一句中概述的目的相去甚远,那么问题就是“如何修复它?”。如果这是实现目标的糟糕方法,那么更好的答案将解释应该如何完成。
import UIKit
import CoreMotion
import MapKit
import CoreLocation
class ActiveSession: UIViewController, CLLocationManagerDelegate {
lazy var locationManager: CLLocationManager! = {
let manager = CLLocationManager()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.delegate = self
return manager
}()
func locationManager(_manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
let myLocation:CLLocationCoordinate2D=CLLocationCoordinate2DMake(oldLocation.coordinate.latitude, oldLocation.coordinate.longitude)
print(myLocation)
if UIApplication.shared.applicationState == .active {
print("at least it's active at all")
} else {
print(newLocation)
print("it's active when the app isn't")
}
}
func getPermission () {
locationManager = CLLocationManager()
switch CLLocationManager.authorizationStatus() {
case .denied, .restricted:
return
case .notDetermined:
locationManager!.requestAlwaysAuthorization()
break
case .authorizedAlways, .authorizedWhenInUse:
break
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.getPermission()
locationManager = CLLocationManager()
locationManager!.desiredAccuracy = kCLLocationAccuracyBest
locationManager?.startUpdatingLocation()
}
}
最佳答案
您在三个地方创建新的 CLLocationManager 实例——惰性 locationManager
初始化器、getPermission
和 viewDidLoad
——以及后两个其中,您既没有设置所需的准确性也没有设置代表。删除 locationManager = CLLocationManager()
行,您应该会得到更好的结果。
关于ios - 无法在后台使用应用程序保持 GPS 事件,或在前台或后台使用应用程序读取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096622/