Служба определения местоположения как Синглтон в Swift, застрять на «Когда используется» - PullRequest
0 голосов
/ 01 мая 2019

Я программирую приложение, которому требуется «Всегда местоположение», и я решил использовать Singleton для поддержания активного отслеживания, так как мне в большинстве случаев нужны службы определения местоположения даже в фоновом режиме.

Когда я запускаюприложение на моем iPhone, консоль говорит, что служба определения местоположения находится в режиме «Когда используется», и мой протокол не получает обновления местоположения от LocationManager.

Что не так с моим Singleton (яновичок Swift, пожалуйста, будьте понятны в своих ответах. Является ли хорошей идеей использовать Singleton для Location Services?

LocationService.swift (ОБНОВЛЕНО)

import Foundation
import CoreLocation

protocol LocationServiceDelegate {
    func onLocationUpdate(location: CLLocation)
    func onLocationDidFailWithError(error: Error)
}

class LocationService: NSObject, CLLocationManagerDelegate {

    public static let shared = LocationService()

    var delegate: LocationServiceDelegate?
    var locationManager: CLLocationManager!
    var currentLocation: CLLocation!

    private override init() {
        super.init()
        self.initializeLocationServices()
    }

    func initializeLocationServices() {
        self.locationManager = CLLocationManager()
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestAlwaysAuthorization()
        self.locationManager.pausesLocationUpdatesAutomatically = false
        self.locationManager.delegate = self
        self.locationManager.startUpdatingLocation()
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        switch status {
            case .restricted:
                print("Location access was restricted.")
            case .denied:
                print("User denied access to location.")
            case .notDetermined:
                self.locationManager.requestAlwaysAuthorization()
            case .authorizedAlways: fallthrough
            case .authorizedWhenInUse:
                print("User choosed locatiom when app is in use.")
            default:
                print("Unhandled error occured.")
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        self.currentLocation = locations.last!
        locationChanged(location: currentLocation)
    }

    private func locationChanged(location: CLLocation) {
        guard let delegate = self.delegate else {
            return
        }
        delegate.onLocationUpdate(location: location)
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        self.locationManager.stopUpdatingLocation()
        locationFailed(error: error)
    }

    private func locationFailed(error: Error) {
        guard let delegate = self.delegate else {
            return
        }
        delegate.onLocationDidFailWithError(error: error)
    }
}

Затем я инициализирую синглтон:

AppDelegate.swift

 let locationService = LocationService.shared

Тогда мой View соответствует моему протоколу:

ViewController.swift

 extension ViewController: LocationServiceDelegate {
    func onLocationUpdate(location: CLLocation) {
        print("Current Location : \(location)")
    }

    func onLocationDidFailWithError(error: Error) {
        print("Error while trying to update device location : \(error)")
    }
}

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Да, вы можете использовать синглтон для ваших целей. Несколько вещей, которые вы можете проверить с помощью вашей реализации:

  • locationManager.pausesLocationUpdatesAutomatics = false.
  • включить фоновые режимы для обновлений местоположения.
  • Переключение на значительные обновления местоположения при переходе приложения в фоновый режим.
0 голосов
/ 02 мая 2019

Это лучший способ отправлять уведомления всем viewControllers для передачи объекта CLLocation или лучше соответствовать моему протоколу во всех контроллерах?

...