Napisałem aplikację za pomocą usług lokalizacyjnych, aplikacja musi wysyłać lokalizację co 10s. I działało bardzo dobrze.
Wystarczy użyć metody „ allowDeferredLocationUpdatesUntilTraveled: timeout ”, postępując zgodnie z dokumentem Apple.
To co zrobiłem to:
Wymagane: Zarejestruj tryb tła dla aktualizacji Lokalizacja.
1. Twórz LocationManger
i za startUpdatingLocation
pomocą accuracy
i filteredDistance
jak chcesz:
-(void) initLocationManager
{
// Create the manager object
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
_locationManager.delegate = self;
// This is the most important property to set for the manager. It ultimately determines how the manager will
// attempt to acquire location and thus, the amount of power that will be consumed.
_locationManager.desiredAccuracy = 45;
_locationManager.distanceFilter = 100;
// Once configured, the location manager must be "started".
[_locationManager startUpdatingLocation];
}
2. Aby aplikacja działała nieprzerwanie przy użyciu allowDeferredLocationUpdatesUntilTraveled:timeout
metody w tle, musisz ponownie uruchomić updatingLocation
nowy parametr, gdy aplikacja przejdzie do tła, w następujący sposób:
- (void)applicationWillResignActive:(UIApplication *)application {
_isBackgroundMode = YES;
[_locationManager stopUpdatingLocation];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[_locationManager setDistanceFilter:kCLDistanceFilterNone];
_locationManager.pausesLocationUpdatesAutomatically = NO;
_locationManager.activityType = CLActivityTypeAutomotiveNavigation;
[_locationManager startUpdatingLocation];
}
3. Aplikacja jest aktualizowana jak zwykle z locationManager:didUpdateLocations:
oddzwanianiem:
-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
// store data
CLLocation *newLocation = [locations lastObject];
self.userLocation = newLocation;
//tell the centralManager that you want to deferred this updatedLocation
if (_isBackgroundMode && !_deferringUpdates)
{
_deferringUpdates = YES;
[self.locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:10];
}
}
4. Ale powinieneś obsłużyć dane, a następnie locationManager:didFinishDeferredUpdatesWithError:
oddzwonić w swoim celu
- (void) locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error {
_deferringUpdates = NO;
//do something
}
5. UWAGA: Myślę, że powinniśmy zresetować parametryLocationManager
każdym razem, gdy aplikacja przełącza się między trybem tła / forgroundu.