Ich habe dies in einer Anwendung getan, die ich entwickle. Die Timer funktionieren nicht, wenn sich die App im Hintergrund befindet, aber die App erhält ständig die Standortaktualisierungen. Ich habe irgendwo in der Dokumentation gelesen (ich kann es jetzt nicht finden, ich werde ein Update veröffentlichen, wenn ich es tue), dass eine Methode nur in einer aktiven Ausführungsschleife aufgerufen werden kann, wenn sich die App im Hintergrund befindet. Der App-Delegat verfügt auch im Hintergrund über eine aktive Ausführungsschleife, sodass Sie keine eigene erstellen müssen, damit dies funktioniert. [Ich bin nicht sicher, ob dies die richtige Erklärung ist, aber so habe ich verstanden, was ich gelesen habe]
Fügen Sie zunächst das location
Objekt für den Schlüssel UIBackgroundModes
in die info.plist Ihrer App ein. Jetzt müssen Sie die Standortaktualisierungen an einer beliebigen Stelle in Ihrer App starten:
CLLocationManager locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;//or whatever class you have for managing location
[locationManager startUpdatingLocation];
Schreiben Sie als Nächstes eine Methode, um die Standortaktualisierungen beispielsweise -(void)didUpdateToLocation:(CLLocation*)location
im App-Delegaten zu verarbeiten. Implementieren Sie dann die Methode locationManager:didUpdateLocation:fromLocation
von CLLocationManagerDelegate
in der Klasse, in der Sie den Standortmanager gestartet haben (da wir den Standortmanager-Delegaten auf 'self' gesetzt haben). Bei dieser Methode müssen Sie überprüfen, ob das Zeitintervall abgelaufen ist, nach dem Sie die Standortaktualisierungen durchführen müssen. Sie können dies tun, indem Sie jedes Mal die aktuelle Zeit speichern. Wenn diese Zeit abgelaufen ist, rufen Sie die Methode UpdateLocation von Ihrem App-Delegaten auf:
NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *lastLocationUpdateTiemstamp;
int locationUpdateInterval = 300;//5 mins
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults) {
lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp];
if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) {
//NSLog(@"New Location: %@", newLocation);
[(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation];
[userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp];
}
}
}
Dadurch wird Ihre Methode alle 5 Minuten aufgerufen, auch wenn sich Ihre App im Hintergrund befindet. Wichtel: Diese Implementierung entlädt den Akku. Wenn die Genauigkeit Ihrer Standortdaten nicht kritisch ist, sollten Sie sie verwenden[locationManager startMonitoringSignificantLocationChanges]
Bevor Sie dies zu Ihrer App hinzufügen, lesen Sie bitte das Location Awareness Programming Guide