2016-12-07 5 views
0

Я пишу приложение, которое требует обновлений местоположения каждые n минут и отправляет данные на сервер, даже если приложение находится в фоновом режиме. Я проделал так много ссылок об этой задаче. Поскольку я нашел правильное решение, нужно использовать таймер и сделать его фоновой задачей.Обновление локального местоположения каждые n минут

Относительно этого у меня есть два вопроса:

  1. Как я могу реализовать эти регулярные обновления фона местоположение? Я понимаю, что Apple позволяет выполнять фоновые задачи только на определенное время. Итак, как я могу сделать длинный фоновый таймер?
  2. Будет ли яблоко отклонять приложение с помощью такой логики?
+0

https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide /BackgroundExecution/BackgroundExecution.html –

+0

приведенная выше ссылка содержит подробный раздел о точном требовании в разделе «Отслеживание местоположения пользователя» –

ответ

1

внутри AppDelegate создать метод, как этот

 func getLocation() 
     { 
       locationManager.allowsBackgroundLocationUpdates = true 
       locationManager.delegate = self 
       locationManager.desiredAccuracy = kCLLocationAccuracyBest    
       locationManager.startUpdatingLocation() 
     } 

внутри didFinishLaunchingWithOptions метода в AppDelegate

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 
    } 
2

Используйте следующие code.This будет работать в течение 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() 


      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{ 


} 
+0

спасибо за ответ. Касательно вашего ответа, возможно ли продлить время фоновой задачи (более 3 минут) или ограничено яблоком? –

+0

Мы не можем увеличить время, поскольку iOS поставил приложение в состояние остановки. Я проверил этот код, он будет работать в течение 180 секунд –