LocationManager验证位置是否有效?

时间:2018-02-10 23:28:24

标签: swift locationmanager

我正在创建一个应用程序,我必须知道该位置是有效的,不是缓存的,还是当前的。

它是一个显示您附近的应用程序(包含数据库和内容)

每10秒钟我从网络中获取数据并在tableView中显示新数据。

让我们说我在商店附近,应用程序显示"你离商店很近"

我关闭应用程序,回家,当我打开应用程序时它仍然显示"你离商店很近"即使我要求了位置..

这是因为它首先返回一个缓存的值..

好的,我 那个哑巴,所以我修复了它:

(我将有效位置保存到userLocation对象中)

因此,当用户关闭应用程序并返回时,它会检查位置是否太旧...如果是,则 userLocation对象被清除 locationManager?.requestLocation()被称为

但是,在didUpdateLocations函数中,它会检查位置是否太旧,如果不是,也就是新的,那么我会从网上获取新数据

// Location Functions
    func setupLocationManager(){
        let authorizationStatus = CLLocationManager.authorizationStatus()
        locationManager = CLLocationManager()
        locationManager?.delegate = self
        locationManager?.requestAlwaysAuthorization()
        locationManager?.startUpdatingLocation() // Log only significant location changes
        locationManager?.pausesLocationUpdatesAutomatically = true // If user is not moving, don't update location
        locationManager?.desiredAccuracy = kCLLocationAccuracyNearestTenMeters // Ten meter accuracy
        locationManager?.distanceFilter = 20 // Update location only if 20m location change
    }
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        currentLocation = locations.last

        // Check if location is not too old.. (aka cached)
        let locationIsValid:Bool = Date().timeIntervalSince(currentLocation!.timestamp) < 11
        if locationIsValid
        {
            currentLocationValue = currentLocation?.coordinate

            // If first loc after opening / returning to app, then fetch data
            if (userLocation.latitude == nil && userLocation.longitude == nil){

                userLocation.location = currentLocation
                userLocation.latitude = currentLocationValue?.latitude
                userLocation.longitude = currentLocationValue?.longitude

                mainFetchData()
            }

            userLocation.location = currentLocation
            userLocation.latitude = currentLocationValue?.latitude
            userLocation.longitude = currentLocationValue?.longitude
        }
    }
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        // Error so remove global variable user location
        userLocation.location = nil
        userLocation.latitude = nil
        userLocation.longitude = nil
    }

    // THIS GETS CALLED EVERYTIME applicationDidBecomeActive !
    @objc func notification_validateCachedLocation(){
        if userLocation.location != nil {
            let lastCachedLocationIsInvalid:Bool = Date().timeIntervalSince(userLocation.location!.timestamp) > 10
            if lastCachedLocationIsInvalid
            {
                userLocation.location = nil
                userLocation.latitude = nil
                userLocation.longitude = nil
                locationManager?.requestLocation()
            }

        } else {
            locationManager?.requestLocation()
        }
    }

但仍有问题:

让我们说你只是回家...你打开应用程序,它会保存你的位置。然后关闭它。

好的,所以在选择了20分钟之后,你又回来再打开应用程序..

然后,LocationManager加载位置,因为您没有移动,因此它不会更新。因此,它将超过10秒,它将只是一个缓存的位置,因此我的应用程序将无法获取数据:C

1 个答案:

答案 0 :(得分:0)

在我看来,你应该自动停止使用pausesLocationUpdates,只是在适合你的时候手动暂停它(停止定位)。