在swift的后台每隔n分钟将位置发送到服务器

时间:2017-12-29 09:05:46

标签: ios iphone swift

我想在应用程序是后台时将位置发送到服务器,我尝试了很多方法但无法获得解决方案

我尝试使用定时器功能并使用功能

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

但我在应用程序变为活动时停止计时器

     if UIApplication.shared.applicationState == .active {
         RunLoop.current.cancelPerformSelectors(withTarget: self.bgtimer)
        timer.invalidate()

    }

但应用程序无法正常收集视图和后退功能一切都无法正常工作

1 个答案:

答案 0 :(得分:1)

  

在DidBackground中:

  1. 停止normalTimer。
  2. 启动新的backgroundTaskTimer
  3.   

    在WillForeground中:

    1. 停止backgroundTaskTimer。
    2. 启动normalTimer
    3. 查找以下示例代码:

        

      在Appdelegate中:

           

      声明:

        var backgroundUpdateTask: UIBackgroundTaskIdentifier!
      
        var backgroundTaskTimer:Timer! = Timer()
      
        

      实现:

      func doBackgroundTask() {
          DispatchQueue.global(qos: .default).async {
              self.beginBackgroundTask()
      
              if self.backgroundTaskTimer != nil {
                  self.backgroundTaskTimer.invalidate()
                  self.backgroundTaskTimer = nil
              }
      
              //Making the app to run in background forever by calling the API
              self.backgroundTaskTimer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(self.startTracking), userInfo: nil, repeats: true)
              RunLoop.current.add(self.backgroundTaskTimer, forMode: RunLoopMode.defaultRunLoopMode)
              RunLoop.current.run()
      
              // End the background task.
              self.endBackgroundTask()
      
          }
      }
      
      func beginBackgroundTask() {
          self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(withName: "Track trip", expirationHandler: {
              self.endBackgroundTask()
          })
      }
      
      func endBackgroundTask() {
          UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
          self.backgroundUpdateTask = UIBackgroundTaskInvalid
      }
      
        

      在ApplicationDidEnterBackground中:

       func applicationDidEnterBackground(_ application: UIApplication) {
      
          //Start the background fetch
           self.doBackgroundTask()
       }
      
        

      在ApplicationWillEnterForeground中:

      func applicationWillEnterForeground(_ application: UIApplication) {
      
          if self.backgroundTaskTimer != nil {
              self.backgroundTaskTimer.invalidate()
              self.backgroundTaskTimer = nil
          }
      }