【问题标题】:How to sync location when app is in background应用程序在后台时如何同步位置
【发布时间】:2019-01-24 02:01:08
【问题描述】:

我想每 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()
        }
    }

【问题讨论】:

  • 确保: 1- 选中项目功能中的“位置更新”选项。 2-您的应用程序被允许检测以检测位置(来自iOS的许可)。
  • 另请查看significantLocationChangeMonitoringAvailable。看看这是否有更好的帮助,因为您的位置管理器呼叫会耗尽电池电量。
  • @adev 他已经做了...请检查代码!
  • @AhmadF,谢谢,不知怎的,我错过了。
  • 每60秒启动一次计时器,它只工作3分钟,然后停止工作

标签: ios swift timer background location


【解决方案1】:

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

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

尝试保持更短的间隔并尝试它会起作用。

【讨论】:

    【解决方案2】:

    您是否处理了来自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

    【讨论】:

    • 多少小时可以在后台获取用户位置?
    • 只要你的应用在后台。
    • 我已经尝试过这种方法,但它的工作时间只有 20 分钟。之后后台同步自动停止
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    相关资源
    最近更新 更多