" didUpdateLocations"在监控重要的位置变化时不会被调用

时间:2016-07-17 18:41:28

标签: ios iphone swift cocoa-touch core-location

我尝试使用名为print(re.findall(r'[^\b]+', "bbb \\bash\baaa")) 的单例位置管理器来监控用户的重要位置更改,它是这样的:

LocationService.Swift

LocationService

myVC.swift

 class var sharedInstance: LocationService {
        struct Static {
            static var onceToken: dispatch_once_t = 0

            static var instance: LocationService? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = LocationService()
        }
        return Static.instance!
    }

    var locationManager: CLLocationManager?
    var location: CLLocation?
    var delegate: LocationServiceDelegate?

    override init() {
        super.init()

        self.locationManager = CLLocationManager()
        guard let locationManager = self.locationManager else {
            return
        }

        if CLLocationManager.authorizationStatus() == .NotDetermined {
            locationManager.requestAlwaysAuthorization()
        }

        locationManager.delegate = self
        locationManager.distanceFilter = 10
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.pausesLocationUpdatesAutomatically = false

        if NSString(string: UIDevice.currentDevice().systemName).floatValue >= 9 {
            locationManager.allowsBackgroundLocationUpdates = true
        }
    }

func startUpdatingLocation() {
        print("Starting Location Updates")
        self.locationManager?.startUpdatingLocation()
    }

func startMonitoringSignificantLocationChanges() {
        print("Starting Significant Location Updates")
        self.locationManager?.startMonitoringSignificantLocationChanges()
    }

// CLLocationManagerDelegate
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        guard let location = locations.last else {
            return
        }

        // singleton for get last location
        self.location = location
    }

private let locationService = LocationService.sharedInstance func prepareInformation() { self.locationService.delegate = self self.locationService.startMonitoringSignificantLocationChanges() } 只在应用程序启动时被调用一次,然后它甚至不会被调用。但当我切换线路时:

didUpdateLocations

为:

self.locationService.startMonitoringSignificantLocationChanges()

效果很好,每次用户移动时都会调用。

可能是什么问题?谢谢!

1 个答案:

答案 0 :(得分:1)

根据Apple文档

  

返回当前位置修复后,接收器会生成更新   仅当用户位置发生重大变化时才会发生事件   检测。 它不依赖于distanceFilter属性中的值   生成事件。

并且

  

只要设备移动500米,应用就会收到通知   或者更多来自之前的通知。不应该期待   通知频率高于每五分钟一次。如果   设备能够从网络中检索位置管理器的数据   更有可能及时发送通知

我认为当用户将其位置更改10米时,您预计会发生一个事件,但此方法并不依赖于distanceFilter。无论何时使用startUpdatingLocation(),您都将获得依赖于distanceFilter属性的事件。

您可以阅读有关此here的更多信息。