Ich habe den folgenden Code geschrieben, der über einen Timer verfügt, der jede Minute eine Rückruffunktion aufruft. Wenn die App in den Hintergrund geht, habe ich einen anderen Timer gestartet, der die gleiche Callback-Methode aufruft, aber der Hintergrund-Timer funktioniert nur für drei Minuten.Führen Sie eine Swift 2.0 App für immer im Hintergrund aus, um den Standort auf den Server zu aktualisieren
Ich verstehe, dass Apple Hintergrundaufgaben nur für drei Minuten erlaubt. Meine App ähnelt eher einer Tracking-App, die den Standort des Benutzers jede Minute verfolgt, auch wenn die App im Hintergrund ist. Daher muss ich diese Funktionalität implementieren.
Ich habe gelernt, dass beginBackgroundTaskWithExpirationHandler
verwendet werden soll, aber ich weiß nicht, ob meine Implementierung korrekt ist.
Hinweis: Ich habe die erforderlichen Hintergrundmodi in plist toApp registriert für Standortaktualisierungen.
Jeder funktionierende Code 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)
})
}
}
Danke für die Hilfe ... Ich bin ziemlich neu zu Swift ... Ich habe versucht, den Genauigkeitswert alle 60 Sekunden zu ändern, wie Sie sagten ... Ich bekomme immer noch das gleiche Ergebnis (dh die App läuft und aktualisiert den Standort nur für drei Minuten nach dem Hintergrund. – Carey
Hallo, tut mir leid, ich habe vergessen zu erwähnen, und ich glaube, dass dies in Ihrem Code fehlt, müssen Sie auch Hintergrundpositionen in Ihrem Standortmanager aktivieren, etwas in der Art von self.locationManager.allowsBackgroundLocationUpdates = true –
Vielen Dank bro.It hat funktioniert! – Carey