Приложение вылетает при использовании locationManager.requestLocation () - PullRequest
0 голосов
/ 09 января 2019

У меня есть этот код:

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        self.locationManager.requestWhenInUseAuthorization()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        super.viewDidLoad()
    }
    @IBAction func sendLocation() {
        locationManager.startUpdatingLocation()
    }
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let coordinate = locations.last?.coordinate else { return }
        print(String(coordinate.latitude))
        locationManager.stopUpdatingLocation()
    }
}

При звонке на UIButton вызывается IBAction, и текущее местоположение пользователя отображается в консоли.

Поскольку мне нужно получить местоположение только один раз, я хотел бы использовать locationManager.requestLocation().

Но при удалении locationManager.stopUpdatingLocation() и замене locationManager.startUpdatingLocation() на locationManager.requestLocation() приложение вылетает при нажатии UIButton со следующими журналами в консоли:

2019-01-09 15: 48: 36.585518 + 0100 GetLocation [1206: 248754] *** Утверждение ошибка в - [CLLocationManager requestLocation], /BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreLocationFramework/CoreLocation-2245.8.25/Framework/CoreLocation/CLLocationManager.m:897

2019-01-09 15: 48: 36.586443 + 0100 GetLocation [1206: 248754] *** Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Делегат должен ответить на locationManager: didFailWithError: '

*** Стек первого вызова:

(0x1b4e08ec4 0x1b3fd9a50 0x1b4d1eb3c 0x1b580d1d0 0x1bbcd8280 0x104690028 0x10469005c 0x1e20f23f8 0x1e1b7ffb8 0x1e1b802d8 0x1e1b7f2d8 0x1e212bb50 0x1e212cdb4 0x1e210c0b0 0x1e21daf1c 0x1e21dd914 0x1e21d6404 0x1b4d991f0 0x1b4d99170 0x1b4d98a54 0x1b4d93920 0x1b4d931f0 0x1b700c584 0x1e20f0ce4 0x104691564 0x1b4852bb4)

libc ++ abi.dylib: завершается с необработанным исключением типа NSException

(lldb)

Почему это? Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Сообщение об ошибке довольно ясно. Вам необходимо реализовать другой метод делегата, locationManager(_:, didFailWithError:).

class ViewController: UIViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        self.locationManager.requestWhenInUseAuthorization()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        super.viewDidLoad()
    }

    @IBAction func sendLocation() {
        locationManager.requestLocation()
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let coordinate = locations.last?.coordinate else { return }
        print(String(coordinate.latitude))
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        // handle the error
    }
}
0 голосов
/ 09 января 2019

Причина четко описана.

причина: 'Делегат должен ответить на locationManager: didFailWithError:'

Вы должны реализовать

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {

}

Поскольку запрашиваемое местоположение происходит асинхронно, это займет время. Когда местоположение с Location Manager, оно уведомляет пользователя через locationManager:didUpdateLocations:

0 голосов
/ 09 января 2019

Возможно, вам потребуется реализовать

func locationManager(_ manager: CLLocationManager, 
         didFailWithError error: Error) {  --- }

Метод делегата CLLocationManagerDelegate

...