美文网首页SwiftUI
SwiftUI一起学之四 -- GPS定位

SwiftUI一起学之四 -- GPS定位

作者: sunny_ke_ke | 来源:发表于2021-05-09 23:13 被阅读0次

    一 申请定位权限

    在项目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显示定位权限和打开第三方地图

    相关文章

      网友评论

        本文标题:SwiftUI一起学之四 -- GPS定位

        本文链接:https://www.haomeiwen.com/subject/dnfbdltx.html