Tôi đã viết một ứng dụng bằng dịch vụ Location, ứng dụng phải gửi vị trí cứ sau 10 giây. Và nó đã làm việc rất tốt.
Chỉ cần sử dụng phương thức " allowDeferredLocationUpdatesUntilTraveled: timeout ", theo tài liệu của Apple.
Những gì tôi đã làm là:
Yêu cầu: Đăng ký chế độ nền để cập nhật Vị trí.
1. Tạo LocationManger
và startUpdatingLocation
, với accuracy
và filteredDistance
như bất cứ điều gì bạn muốn:
-(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. Để giữ cho ứng dụng chạy mãi mãi bằng allowDeferredLocationUpdatesUntilTraveled:timeout
phương thức ở chế độ nền, bạn phải khởi động lại updatingLocation
với tham số mới khi ứng dụng chuyển sang nền, như thế này:
- (void)applicationWillResignActive:(UIApplication *)application {
_isBackgroundMode = YES;
[_locationManager stopUpdatingLocation];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[_locationManager setDistanceFilter:kCLDistanceFilterNone];
_locationManager.pausesLocationUpdatesAutomatically = NO;
_locationManager.activityType = CLActivityTypeAutomotiveNavigation;
[_locationManager startUpdatingLocation];
}
3. Ứng dụng được cập nhậtLocations như bình thường với locationManager:didUpdateLocations:
gọi lại:
-(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. Nhưng bạn nên xử lý dữ liệu sau đó locationManager:didFinishDeferredUpdatesWithError:
gọi lại cho mục đích của bạn
- (void) locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error {
_deferringUpdates = NO;
//do something
}
5. LƯU Ý: Tôi nghĩ rằng chúng ta nên đặt lại các tham số của LocationManager
mỗi lần chuyển đổi ứng dụng giữa chế độ nền / nền tảng.