每n分钟更新一次背景位置

时间:2016-12-07 10:20:59

标签: ios swift3 nstimer background-process

我正在编写一个每n分钟需要位置更新的应用程序,即使应用程序处于后台模式,也会将数据发送到服务器。关于这个任务,我经历了很多链接。正如我发现正确的解决方案是使用计时器并将其作为后台任务。

关于这一点,我有两个问题:

  1. 如何实施这些常规后台位置更新?我知道Apple只允许一段时间的后台任务。那么如何制作长时间运行的后台计时器?
  2. 苹果会拒绝使用这种逻辑的应用程序吗?

2 个答案:

答案 0 :(得分:2)

在appdelegate里面创建像这样的方法

      func getLocation()
      {
              locationManager.allowsBackgroundLocationUpdates = true
              locationManager.delegate = self
              locationManager.desiredAccuracy = kCLLocationAccuracyBest             
              locationManager.startUpdatingLocation()
      }
appdelegate中的didFinishLaunchingWithOptions方法

var n = 10 //seconds

var timer = Timer.scheduledTimer(timeInterval: n, target: self, selector: #selector(getLocation), userInfo: nil, repeats: true)

设置cllocationmanager的委托方法

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
  {
    locationManager.stopUpdatingLocation()
    locationManager.delegate = nil
    //get the coordinates or do some code
  }

答案 1 :(得分:2)

使用以下代码。这将有效3分钟

调用此didenterbackground或前景

var time = 180
func applicationDidEnterBackground(_ application: UIApplication)
    {

        self.doBackgroundTask()
    }

 var timerBack  = Timer()
    func doBackgroundTask() {

        DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
            self.beginBackgroundUpdateTask()

              print("Background time remaining = \(UIApplication.shared.backgroundTimeRemaining) seconds")

            self.timerBack = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(AppDelegate.displayAlert), userInfo: nil, repeats: true)
            RunLoop.current.add(self.timerBack, forMode: RunLoopMode.defaultRunLoopMode)
            RunLoop.current.run()

            self.endBackgroundUpdateTask()
        }
    }
    var backgroundUpdateTask: UIBackgroundTaskIdentifier!

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

    func endBackgroundUpdateTask() {
        UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
        self.backgroundUpdateTask = UIBackgroundTaskInvalid
    }

//做你想做的事

func displayAlert{


}