【发布时间】:2016-10-17 22:23:10
【问题描述】:
与此问题相关的应用旨在以高精度跟踪用户位置,包括 GPS 坐标和加速度计读数,持续 30 分钟,即使用户按下了睡眠按钮。
为此,plist 文件和应用功能设置已更改,以反映始终开启导航访问的原因并启用后台进程以提供基于位置的服务。
应用程序在运行时会询问用户 GPS 权限,如果授予权限,则激活此视图控制器(包含以下代码的视图控制器)确实会导致 GPS/导航图标显示在苹果手机。
问题是,到目前为止,下面看到的四个“打印”命令都不会产生任何打印消息,因此“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()
}
}
【问题讨论】:
-
不要忘记位置管理器的“allowsBackgroundLocationUpdates”属性。
-
我建议将位置管理器移出视图控制器,并将其放入 AppDelegate 或其自己的对象中,或者是单例,也可以是在 AppDelegate 上持有引用的对象。您可以简化您的
getPermission代码 - 只需调用requestAlwaysAuthorization- 如果尚未授予或拒绝权限,这将请求权限。如果对话框已被回答,则不显示任何内容。
标签: ios swift swift3 cllocationmanager