Swift: получить текущие пользовательские координаты и сохранить их в переменной - PullRequest
0 голосов
/ 23 апреля 2020

В настоящее время я пытаюсь получить текущие координаты пользователя и в конечном итоге сохранить эти значения в переменных.

Я создал следующий класс, чтобы определить текущее местоположение пользователя и настроить функции для извлечения данных.

import Foundation
import CoreLocation

class MyCurrentCoordinate: NSObject {


     private var currentLocation: CLLocation!

     var myLatitude = 0.0
     var myLongitude = 0.0
     var myAltitude = 0.0

     override init() {
         super.init()
     }

     func getLat() {
         myLatitude = currentLocation.coordinate.latitude
     }

     func getLong() {
         myLongitude = currentLocation.coordinate.longitude
     }

     func getAlt() {
         myAltitude = currentLocation.altitude
     }
}

Это не показывает никаких ошибок. Однако, когда я go вызываю любую функцию (getLat, getLong или getAlt) для извлечения части данных о местоположении пользователей, приложение вылетает из-за того, что значение равно nil. Кто-нибудь знает, почему фактический пользователь широта, долгота или высота не передаются?

У меня есть разрешение на местоположение и обновленный info.plist, чтобы пользователь мог дать разрешение на отслеживание местоположения.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020
import Foundation
import CoreLocation
import UIKit

public protocol LocalizationHelperDelegate: class {
    func didUpdateLocation(_ sender: CLLocation)
}

public class LocalizationHelper: NSObject {

    public weak var delegate: LocalizationHelperDelegate?
    public static var shared = LocalizationHelper()

    private lazy var locationManager: CLLocationManager = {
        let locationManager = CLLocationManager()
        locationManager.requestAlwaysAuthorization()
        locationManager.allowsBackgroundLocationUpdates = true
        locationManager.pausesLocationUpdatesAutomatically = false
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        return locationManager
    }()

    private var currentLocation: CLLocationCoordinate2D?

    public func startUpdatingLocation() {
        locationManager.delegate = self
        locationManager.startUpdatingLocation()
    }

    public func stopUpdatingLocation() {
        locationManager.stopUpdatingLocation()
    }

    public func getCurrentLocation() -> CLLocationCoordinate2D? {
        return currentLocation
    }

    public func getLat() -> Double{
        return currentLocation?.latitude ?? 0.0
    }

    public func getLon() -> Double{
        return currentLocation?.longitude ?? 0.0
    }


}

extension LocalizationHelper: CLLocationManagerDelegate {

    public func locationManager(_: CLLocationManager, didUpdateLocations locations: [CLLocation]){
        guard let location = locations.first else { return }
        currentLocation = location.coordinate
        print("[Update location at - \(Date())] with - lat: \(currentLocation!.latitude), lng: \(currentLocation!.longitude)")
        delegate?.didUpdateLocation(location)
    }
}

Как использовать

LocalizationHelper.shared.Start()
...
let lat = LocalizationHelper.shared.getLat()
let lon = LocalizationHelper.shared.getLon()
...
LocalizationHelper.shared.Stop()
0 голосов
/ 23 апреля 2020

Вы можете использовать CLLocationManager

  1. Добавить возможность приложения, вы можете открыть свой info.plist как исходный код и добавить:

    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>App requires allways tracking</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>App requires background tracking</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>App requires tracking when be in use</string>
    
    <key>UIBackgroundModes</key>
    <array>
        <string>fetch</string>
        <string>location</string>
        <string>remote-notification</string>
    </array>
    
  2. Запросите авторизацию, например locationManager.requestAlwaysAuthorization (), и управляйте, если у вас есть правильный доступ ... CLLocationManager.authorizationStatus () == .authorizedAlways

    import CoreLocation
    
    class ViewController: UIViewController, CLLocationManagerDelegate {
        var locationManager: CLLocationManager?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            locationManager = CLLocationManager()
            locationManager?.delegate = self
            locationManager?.requestAlwaysAuthorization()
            if CLLocationManager.authorizationStatus() == .authorizedAlways {
                locationManager.allowsBackgroundLocationUpdates = true
                locationManager.pausesLocationUpdatesAutomatically = false
                locationManager.desiredAccuracy = kCLLocationAccuracyBest
                locationManager.startUpdatingLocation()
            }
            if CLLocationManager.authorizationStatus() == .authorizedWhenInUse {
                locationManager.allowsBackgroundLocationUpdates = false
                locationManager.pausesLocationUpdatesAutomatically = true
                locationManager.desiredAccuracy = kCLLocationAccuracyBest
                locationManager.startUpdatingLocation()
            }
        }
    }
    
    extension ViewController: CLLocationManagerDelegate {
    
        public func locationManager(_: CLLocationManager, didUpdateLocations locations: [CLLocation]){
            guard let location = locations.first else { return }
            print(location)
    
        }
    
        public func locationManager(_: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
            switch status {
            case .notDetermined:
                print("Autorization status did change \(status)")
            case .authorizedWhenInUse:
                print("Autorization status did change \(status)")
            case .authorizedAlways:
                print("Autorization status did change \(status)")
            case .restricted:
                print("Autorization status did change \(status)")
            case .denied:
                print("Autorization status did change \(status)")
            @unknown default:
                fatalError()
            }
        }
    }
    
  3. Не забудьте остановиться это в каком-то месте locationManager.stopUpdatingLocation ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...