SwiftUI一起学之四 -- GPS定位
2021-05-09 本文已影响0人
sunny_ke_ke
一 申请定位权限
在项目Info.plist文件中,配置如下定位权限
- NSLocationWhenInUseUsageDescription (应用使用期间),
- NSLocationAlwaysUsageDescription(始终允许),
- NSLocationAlwaysAndWhenInUseUsageDescription(始终允许,iOS11新增)
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>需要定位权限</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>需要定位权限</string>
<key>NSLocationUsageDescription</key>
<string>需要定位权限</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>需要定位权限</string>
二 后台定位更新
在项目的TAGETS里面,配置ios后台模式Background Modes
image.png
三 获取定位
定位精度设置: self.locationManager.desiredAccuracy
kCLLocationAccuracyBestForNavigation // 一般用于车载导航
kCLLocationAccuracyBest // 最好的
kCLLocationAccuracyNearestTenMeters // 10m
kCLLocationAccuracyHundredMeters // 100m
kCLLocationAccuracyKilometer // 1000m
kCLLocationAccuracyThreeKilometers //3000m
import Foundation
import CoreLocation
import Combine
class LocationManager: NSObject, ObservableObject {
static let shareSingleOne = LocationManager()
override init() {
super.init()
self.locationManager.delegate = self
//间隔多少米定位
self.locationManager.distanceFilter = 100
//设置定位精度
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager.requestAlwaysAuthorization()
self.locationManager.requestWhenInUseAuthorization()
self.locationManager.pausesLocationUpdatesAutomatically = false
if #available(iOS 9.0, *) {
// 如果APP处于后台,则会出现蓝条
locationManager.allowsBackgroundLocationUpdates = true
}
self.locationManager.startUpdatingLocation()
}
@Published var locationStatus: CLAuthorizationStatus?
{
willSet {
objectWillChange.send()
}
}
@Published var lastLocation: CLLocation? {
willSet {
objectWillChange.send()
}
}
var statusString: String {
guard let status = locationStatus else {
return "unknown"
}
switch status {
case .notDetermined: return "notDetermined"
case .authorizedWhenInUse: return "authorizedWhenInUse"
case .authorizedAlways: return "authorizedAlways"
case .restricted: return "restricted"
case .denied: return "denied"
default: return "unknown"
}
}
let objectWillChange = PassthroughSubject<Void, Never>()
private let locationManager = CLLocationManager()
}
extension LocationManager: CLLocationManagerDelegate {
// 授权状态变化回调
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
self.locationStatus = status
print(#function, statusString)
}
// 更新位置变化的回调
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
self.lastLocation = location
print("新的定位数据 \(location)")
print(#function, location)
}
}
四 显示定位信息
import SwiftUI
struct MainUIView: View {
@ObservedObject var locationManager = LocationManager()
var userLatitude: String {
return "\(locationManager.lastLocation?.coordinate.latitude ?? 0)"
}
var userLongitude: String {
return "\(locationManager.lastLocation?.coordinate.longitude ?? 0)"
}
var body: some View {
VStack {
HStack {
Text("latitude: \(userLatitude)")
Text("longitude: \(userLongitude)")
}
}
}
}
struct MainUIView_Previews: PreviewProvider {
static var previews: some View {
MainUIView()
}
}
参考: