ü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)
})
}
}