应用程序在后台时如何同步位置

时间:2018-08-17 04:30:35

标签: ios swift timer background location

我想每15分钟将用户当前的Location发送到服务器。当应用程序在前台时,timer正在运行,但是当应用程序在后台时,计时器没有运行。我搜索了很多,但没有找到任何解决方案。你能告诉我我做什么。我正在使用以下代码进行后台位置同步,但无法正常工作。

    var locationManager = CLLocationManager()
    var currentLocation: CLLocation?
    var timer : Timer?
    var backgroundTaskIdentifier: UIBackgroundTaskIdentifier?

   func getCurrentLocation()
    {
        // Do any additional setup after loading the view, typically from a nib.
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.requestAlwaysAuthorization()
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.allowsBackgroundLocationUpdates = true
        locationManager.pausesLocationUpdatesAutomatically = false
        //
        backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
            UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!)
        })
        let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: true) { (timer) in
            self.locationManager.startUpdatingLocation()
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        print("locations = \(locations)")
        if  let location = locations.last
        {
            print("location\(String(describing: location.coordinate))")
            currentLocation = location
            locationManager.stopUpdatingLocation()
        }
    }

2 个答案:

答案 0 :(得分:0)

我也有类似的要求,但是时间间隔是5分钟。

您的应用可能闲置了更长的时间(15分钟),原因是操作系统未更新您的位置。

尝试保持较短的时间间隔,然后尝试使用。

答案 1 :(得分:0)

您是否从AppDelegate处理应用程序状态的位置更新?如果没有,则可以使用AppDelegate中的以下方法更新代码。

var locationManager = CLLocationManager()

func doBackgroundTask() {
    DispatchQueue.global(qos: .background).async {
        self.beginBackgroundUpdateTask()
        self.StartupdateLocation()
        RunLoop.current.run()
    }
}

func beginBackgroundUpdateTask() {
    backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
        self.endBackgroundUpdateTask()
    })
}
func endBackgroundUpdateTask() {
    UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
    self.backgroundUpdateTask = UIBackgroundTaskInvalid
}

func StartupdateLocation() {
    locationManager.startUpdatingLocation()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLDistanceFilterNone
    locationManager.requestAlwaysAuthorization()
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.pausesLocationUpdatesAutomatically = false
}

在应用程序进入后台状态时调用该方法。

func applicationWillResignActive(_ application: UIApplication) {
    self.doBackgroundTask()
}

当应用程序在后台运行时,此方法将帮助您获取位置更新。 如果您遇到其他困难,可以查看此链接。 Update location in Background