面试题答案
一键面试遇到的挑战
- 权限管理:用户可能拒绝授予定位权限,需妥善处理权限请求及不同权限状态。
- 后台运行限制:iOS对后台运行有严格限制,应用进入后台后,可能被系统终止或限制资源。
- 电池功耗:持续定位会消耗大量电量,需优化以减少对电池的影响。
项目配置
- Info.plist配置:
- 添加
NSLocationAlwaysAndWhenInUseUsageDescription
键,描述应用为何需要始终获取位置信息。 - 添加
NSLocationWhenInUseUsageDescription
键,描述应用在前台使用时获取位置信息的原因。
- 添加
- Capabilities开启:在项目设置中,开启
Background Modes
,并勾选Location updates
。
代码实现思路
- 权限请求:检查并请求定位权限。
- 初始化定位管理器:配置定位管理器的相关属性。
- 开始定位:在前台和后台都能持续接收位置更新。
- 优化功耗:设置合适的定位精度等参数。
关键代码
import CoreLocation
class LocationManager: NSObject, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override init() {
super.init()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.activityType =.fitness
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.allowsBackgroundLocationUpdates = true
}
func requestAuthorization() {
if CLLocationManager.locationServicesEnabled() {
switch CLLocationManager.authorizationStatus() {
case.notDetermined:
locationManager.requestAlwaysAuthorization()
case.restricted, .denied:
// 处理权限受限或被拒情况
break
case.authorizedAlways, .authorizedWhenInUse:
startLocationUpdates()
@unknown default:
break
}
} else {
// 处理定位服务未开启情况
}
}
func startLocationUpdates() {
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
print("Location: \(location)")
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways || status == .authorizedWhenInUse {
startLocationUpdates()
}
}
}
使用时:
let locationManager = LocationManager()
locationManager.requestAuthorization()