ühren Sie eine Swift 2.0-App für immer im Hintergrund aus, um den Speicherort auf dem Server zu aktualisiere

Ich habe den folgenden Code geschrieben, der einen Timer hat, der jede Minute eine Rückruffunktion aufruft. Wenn die App in den Hintergrund wechselt, habe ich einen anderen Timer gestartet, der dieselbe Rückrufmethode aufruft, aber der Hintergrund-Timer funktioniert nur für drei Minuten.

ch verstehe, dass Apple Hintergrundaufgaben nur für drei Minuten zulässt. Meine App ähnelt eher einer Tracking-App, die den Standort des Benutzers jede Minute verfolgt, auch wenn sich die App im Hintergrund befindet. Daher muss ich diese Funktionalität implementieren.

Ich habe das gelerntbeginBackgroundTaskWithExpirationHandler soll verwendet werden, aber ich weiß nicht, ob meine Implementierung korrekt ist.

Hinweis: Ich habe die erforderlichen Hintergrundmodi in den Plist-to-App-Registern für Standortaktualisierungen.

Alle funktionierenden Codes oder Links werden sehr geschätzt.

override func viewDidLoad() {
    super.viewDidLoad()

    timeInMinutes = 1 * 60

    self.locationManager.requestAlwaysAuthorization()

    self.locationManager.requestWhenInUseAuthorization()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }

    var timer = NSTimer.scheduledTimerWithTimeInterval( timeInMinutes, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate

    self.latitude = locValue.latitude
    self.longitude = locValue.longitude

    if UIApplication.sharedApplication().applicationState == .Active {

    } else {
        backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ () -> Void in
            self.backgroundTimer.invalidate()
            self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval( 60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
        })
    }
}

func updateLocation() {
    txtlocationLabel.text = String(n)
    self.n = self.n+1

    var timeRemaining = UIApplication.sharedApplication().backgroundTimeRemaining

    print(timeRemaining)

    if timeRemaining > 60.0 {
        self.GeoLogLocation(self.latitude,Longitude: self.longitude) {
            results in
            print("View Controller: \(results)")
            self.CheckResult(String(results))
        }
    } else {
        if timeRemaining == 0 {
            UIApplication.sharedApplication().endBackgroundTask(backgroundTaskIdentifier)
        }

        backgroundTaskIdentifier2 = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ () -> Void in
            self.backgroundTimer.invalidate()
            self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval( 60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
        })
    }
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage