запустить CLLocation в течение жизненного цикла приложения - PullRequest
0 голосов
/ 12 февраля 2020

Могу ли я включить службы определения местоположения и поддерживать их работу глобально, вместо того, чтобы включать их в каждом UIViewController? Я знаю, что это не энергоэффективно, но я бы хотел, чтобы службы определения местоположения работали по всему приложению, а не включали их на каждом контроллере. Одна из причин в том, что я обнаружил, что когда я выполняю locationManager.startUpdatingLocation, то местоположение изначально менее точно, а затем сходится к более точному.

В идеале: оно будет работать следующим образом:

class AppDelegate: UIResponder, UIApplicationDelegate {

    let locationManager = CLLocationManager()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        /// LOCATION MANAGER
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
    }
}

И тогда в любом месте моего приложения я хотел бы позвонить:

if let location = locationManager.location {
// get the location info immediately
}

Спасибо,

1 Ответ

1 голос
/ 12 февраля 2020

Используя Singletons, вы можете использовать местоположение в любом месте кода. Синглтоны - это объекты, которые должны создаваться только один раз, а затем передаваться везде, где их нужно использовать. Вы можете создать отдельный класс для доступа к местоположению

import Foundation
import CoreLocation

class LocationSyncManager, CLLocationManagerDelegate {

    static let shared = LocationSyncManager()
    var locationManager: CLLocationManager!

    private init(){}

    func requestForLocation() {

        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()

    }

   //add delegate methods
}

И вы можете получить к нему доступ в AppDelegate

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

     LocationSyncManager.shared.requestForLocation()

    }
}

Вы также можете взять ссылку: https://medium.com/@nimjea / singleton -класс-в-Свифта-17eef2d01d88

...