Ich habe dies in einer Anwendung, die ich entwickle. Die Timer funktionieren nicht, wenn sich die App im Hintergrund befindet, die App jedoch ständig die Standortaktualisierungen empfängt. Ich habe irgendwo in der Dokumentation gelesen (ich kann es anscheinend nicht finden, ich poste ein Update, wenn ich das tue), dass eine Methode nur auf einer aktiven Laufschleife aufgerufen werden kann, wenn die App im Hintergrund ist. Der App-Delegat hat sogar im bg eine aktive Laufschleife, so dass Sie keine eigenen erstellen müssen, damit dies funktioniert. [Ich bin nicht sicher, ob dies die richtige Erklärung ist, aber das ist, wie ich aus dem, was ich gelesen habe verstanden habe]
Zuerst fügen Sie das Objekt 'Location' für den Schlüssel 'Hintergrundmodi' in der Datei info.plist Ihrer App hinzu. Nun, was Sie tun müssen, ist die Lage Updates überall in Ihrer Anwendung starten:
CLLocationManager locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;//or whatever class you have for managing location
[locationManager startUpdatingLocation];
Als nächstes schreiben ein Verfahren mit den Standortaktualisierungen zu handhaben, sagen - (void) didUpdateToLocation: (CLLocation *) Lage, in der App-Delegierte Implementieren Sie dann die Methode locationManager: didUpdateLocation: fromLocation von CLLocationManagerDelegate in der Klasse, in der Sie den Standortmanager gestartet haben (da wir den Standortmanagerdelegaten auf 'self' festgelegt haben). Innerhalb dieser Methode müssen Sie überprüfen, ob das Zeitintervall, nach dem Sie die Standortaktualisierungen verarbeiten müssen, abgelaufen ist. Sie können dies tun, indem Sie jedes Mal die aktuelle Uhrzeit speichern. Wenn diese Zeit abgelaufen ist, rufen Sie die Methode UpdateLocation von AppDelegate:
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];
}
}
}
Dies ruft Ihre Methode alle 5 Minuten, auch wenn die App im Hintergrund ist. Imp: Diese Implementierung leert die Batterie, wenn Ihre Standortdaten die Genauigkeit nicht kritisch ist, sollten Sie verwenden [Location startMonitoringSignificantLocationChanges]
Vor dem Hinzufügen dieser zu Ihrer Anwendung finden Sie in der Location Awareness Programming Guide bei http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html
Wenn ich mich nicht irre, wird didUpdateToLocation nur alle 5 Minuten aufgerufen, wenn didUpdateLocation in regelmäßigen kleinen Intervallen aufgerufen wird. Wenn Sie startMonitoringSignificantChanges auswählen und sich nicht viel bewegen, erhalten Sie keine Updates in einem Intervall von 5 Minuten. Richtig? – Lolo