2016-12-07 2 views
0

Ich schreibe eine Anwendung, die alle n Minuten Ortsaktualisierungen erfordert und Daten an einen Server sendet, auch wenn sich die Anwendung im Hintergrundmodus befindet. Ich habe so viele Links zu dieser Aufgabe durchgespielt. Wie ich die richtige Lösung fand, ist es, einen Timer zu verwenden und es als Hintergrundaufgabe zu machen.Aktualisierung des Hintergrundstandorts alle n Minuten

dazu Bezüglich Ich habe zwei Fragen:

  1. Wie kann ich diese regelmäßigen Hintergrundstandortaktualisierungen implementieren? Ich verstehe, dass Apple Hintergrundaufgaben nur für eine bestimmte Zeit erlaubt. Wie kann ich einen lang laufenden Hintergrund-Timer erstellen?
  2. Wird Apple die Anwendung mit solchen Logiken ablehnen?
+0

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

+0

der oben genannte Link haben Detail Abschnitt über die genaue Anforderung unter "Tracking des Benutzerstandortes" –

Antwort

1

innen AppDelegate Verfahren erzeugen ähnliche

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

innen didFinishLaunchingWithOptions Methode in AppDelegate

var n = 10 //seconds 

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

setzen die Delegatmethode für CLLocationManager

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

Verwenden folgenden code.This wird arbeite für 3 Minuten tes

Rufen Sie diese didenterbackground oder Vordergrund

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 
    } 

// tun, was Sie

func displayAlert{ 


} 
+0

Dank für die Antwort. In Bezug auf Ihre Antwort, ist es möglich, die Zeit der Hintergrundaufgabe zu verlängern (mehr als 3 Minuten) oder ist es durch Apfel begrenzt? –

+0

Wir können die Zeit nicht erhöhen, da iOS die App in den Haltezustand versetzt. Ich habe diesen Code getestet, der 180 Sekunden lang funktioniert –