Ошибка развертывания Location Manager только при первом запуске - PullRequest
0 голосов
/ 09 мая 2019

Каждый раз, когда я устанавливаю свое приложение на новое устройство, я получаю неожиданно найденный ноль, неявно распаковывая дополнительное значение во время самого первого запуска!

Но последующие запуски в порядке и не дают сбоев.

Это строка сбоев

let Startlat = String(LocationManager.sharedInstance.location.coordinate.latitude)

Я не уверен, что может вызвать это, так как это происходит только во время самогоПервый запуск!

Ответы [ 2 ]

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

Экземпляр одноэлементного класса инициализируется только тогда, когда вы обращаетесь к свойству класса или вызываете метод класса.Первоначально свойство местоположения будет нулевым.Поэтому создайте такой метод запуска и вызовите метод в AppDelegate

. И не объявляйте свойство location в классе LocationManager как явно развернутое необязательное

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        LocationManager.shared.start()
        print(LocationManager.shared.location?.coordinate.latitude)//will never crash
        return true
    }

LocationManager.swift

class LocationManager {
    static let shared = LocationManager()
    var location: CLLocation?
    var manager = CLLocationManager()
    private init() {

    }
    func start() {
        manager.requestAlwaysAuthorization()
        manager.startUpdatingLocation()
    }
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        LocationManager.shared.location = locations.last
    }
}
0 голосов
/ 09 мая 2019

Первый запуск включает асинхронное разрешение пользователя, поэтому location будет нулевым во время доступа с !

var location: CLLocation! /// <<<<< ! should be ?

, нужно сделать

if let loc = LocationManager.sharedInstance.location as? CLLocation {
}
...