在Swift中作为Singleton的位置服务,卡在“使用中”

问题描述 投票:0回答:2

我正在编写一个需要“始终位置”的应用程序,我决定使用Singleton来保持跟踪活动,因为我大部分时间都需要位置服务,即使在后台也是如此。

当我在iPhone上运行应用程序时,控制台说位置服务处于“何时使用”模式,并且我的协议没有从LocationManager获取位置更新。

我的Singleton有什么问题(我是一个Swift新手,请在你的答案中说清楚。使用Singleton进行定位服务是个好主意吗?

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

然后我的视图符合我的协议:

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)")
    }
}
ios swift xcode location core-location
2个回答
1
投票

是的,你可以使用单身人士。您可以通过实施检查几件事:

  • locationManager.pausesLocationUpdatesAutomatically = false。
  • 启用位置更新的后台模式。
  • 当应用移动到后台时切换到重要的位置更新。

0
投票

这是向所有viewControllers发送通知以传递CLLocation对象的更好方法,还是更好地符合我在每个控制器中的协议?

© www.soinside.com 2019 - 2024. All rights reserved.