SwiftUI

SwiftUI一起学之四 -- GPS定位

2021-05-09  本文已影响0人  sunny_ke_ke

一 申请定位权限

在项目Info.plist文件中,配置如下定位权限

  1. NSLocationWhenInUseUsageDescription (应用使用期间),
  2. NSLocationAlwaysUsageDescription(始终允许),
  3. 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.pngimage.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()
    }
}

参考:

  1. iOS显示定位权限和打开第三方地图
上一篇 下一篇

猜你喜欢

热点阅读