Не получить текущее местоположение пользователей в Swift 4 - PullRequest
0 голосов
/ 24 октября 2018

Местоположение не выводится на консоль.У меня был этот точный код, работающий ранее, но после обновления до Xcode 10 он не выводит текущее местоположение пользователя в консоль.

var locationManager: CLLocationManager!

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    determineMyCurrentLocation()
}


func determineMyCurrentLocation() {
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.startUpdatingLocation()
    }
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userLocation:CLLocation = locations[0] as CLLocation

    print("user latitude = \(userLocation.coordinate.latitude)")
    print("user longitude = \(userLocation.coordinate.longitude)")

}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
{
    print("Error \(error)")
}

Info.plist: enter image description here

Ответы [ 4 ]

0 голосов
/ 17 мая 2019

Шаг: 1 - импорт

import MapKit
import CoreLocation

Шаг: 2 - использование: MKMapViewDelegate, CLLocationManagerDelegate

Шаг: 3-

var locationManager = CLLocationManager()
var latitude: Double = 0.0
var longitude: Double = 0.0

Шаг: 4 - В ViewDidLoad

 self.determineMyCurrentLocation()

Шаг: 5 - определение функции

func determineMyCurrentLocation() {
    if CLLocationManager.locationServicesEnabled()
    {
        self.locationManager = CLLocationManager()
        self.locationManager.delegate = self
        self.locationManager.distanceFilter = kCLDistanceFilterNone
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest

        let authorizationStatus = CLLocationManager.authorizationStatus()
        if (authorizationStatus == .authorizedWhenInUse || authorizationStatus == .authorizedAlways)
        {
            self.locationManager.startUpdatingLocation()
        }
        else if (locationManager.responds(to: #selector(CLLocationManager.requestAlwaysAuthorization)))
        {
             self.locationManager.requestAlwaysAuthorization()
        }
        else
        {
            self.locationManager.startUpdatingLocation()
        }
    }
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
    {
        print("Error while requesting new coordinates")
    }

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
    self.latitude = locations[0].coordinate.latitude
    self.longitude = locations[0].coordinate.longitude
}

Вставить в info.plist {Конфиденциальность - Описание использования местоположения, Конфиденциальность - Местоположение всегда и при использовании Описание использования, Конфиденциальность - Местоположение Описание использования при использовании, Конфиденциальность - Описание использования всегда}}

0 голосов
/ 24 октября 2018

Вы импортировали CoreLocation?

Попробуйте изменить locationManager форму

var locationManager: CLLocationManager!

на

let locationManager = CLLocationManager()

, и тогда вам не нужноэто в determineMyCurrentLocation()

Я также let userLocation = CLLocation() в верхней части вашего класса, а затем обновить ваше местоположение.

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]){
    let newLocation = locations[0]
    let distance = userLocation.distance(from: newLocation)
    // using this to update my location every 100m
    if distance > 100 {
        userLocation = newLocation
    }

    print("user latitude = \(userLocation.coordinate.latitude)")
    print("user longitude = \(userLocation.coordinate.longitude)")
}
0 голосов
/ 24 октября 2018

Проблема в вашем Info.plist .Вам нужно все три клавиши :

enter image description here

Исправьте это, и приложение оживет.Я вставил ваш код в проект, настроил Info.plist , как показано, и он работал нормально.

Вы можете фактически опустить «Always», начиная с iOS 11, но вы должны иметьи «Когда используется» и «Всегда и когда используется», даже если вы планируете запрашивать только «Всегда».

Среда выполнения фактически говорила вам это все время в консоли Xcode, ноВы, очевидно, не смотрели на это.В нем говорится:

Info.plist приложения должен содержать ключи NSLocationAlwaysAndWhenInUseUsageDescription и NSLocationWhenInUseUsageDescription со строковыми значениями, объясняющими пользователю, как приложение использует эти данные.

0 голосов
/ 24 октября 2018

Подтвердите NSLocationWhenInUseUsageDescription и NSLocationAlwaysUseUsageDescription в вашем файле plist.

...