Ho scritto il codice seguente che ha un timer che chiama una funzione di richiamata ogni minuto. Quando l'app va in secondo piano, ho avviato un altro timer che chiama lo stesso metodo di callback, ma il timer dello sfondo funziona solo per tre minuti.Eseguire un'app Swift 2.0 per sempre in background per aggiornare la posizione sul server
Comprendo che Apple consente attività in background per soli tre minuti. La mia app è più simile a un'app di monitoraggio che traccia la posizione dell'utente ogni minuto anche quando l'app è in background, quindi ho bisogno di implementare questa funzionalità.
Ho appreso che è necessario utilizzare beginBackgroundTaskWithExpirationHandler
ma non so se la mia implementazione è corretta.
Nota: sono necessarie le modalità in background nei registri plist su app per gli aggiornamenti di posizione.
Qualsiasi codice o collegamento funzionante è molto apprezzato.
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)
})
}
}
Grazie per l'aiuto ... Sono abbastanza nuovo per Swift ... Ho provato a cambiare il valore di precisione ogni 60 secondi come hai detto ... Ho ancora lo stesso risultato (cioè l'app esegue e aggiorna la posizione solo per tre minuti dopo lo sfondo) – Carey
Ciao, scusami ho dimenticato di menzionare, e credo che questo manchi nel tuo codice, devi anche abilitare le posizioni in background nel tuo location manager, qualcosa sulla falsariga di self.locationManager.allowsBackgroundLocationUpdates = true –
Grazie mille. Ha funzionato! – Carey