我的应用需要在后台使用定位服务。所以我添加了以下方法
- (void)startStandardUpdates
{
// Create the location manager if this object does not
// already have one.
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
// Set a movement threshold for new events.
locationManager.distanceFilter = 500;
[locationManager startUpdatingLocation];
}
根据 apple's文件,它说当位置发生变化时,应用程序会收到通知,即 - (void) locationManagerCLLocationManager *)manager didUpdateToLocationCLLocation *)newLocation fromLocationCLLocation *)oldLocation 委托(delegate)方法将被调用。
为了做一些后台处理(延长处理时间)我在上面指定的委托(delegate)方法中添加了ExpirationHandler 如下
- (void) locationManagerCLLocationManager *)manager didUpdateToLocationCLLocation *)newLocation fromLocationCLLocation *)oldLocation {
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
bgTask = UIBackgroundTaskInvalid;
}];
longitude = newLocation.coordinate.longitude;
latitude = newLocation.coordinate.latitude;
//Making webservice
[self updateServerWithLongitude:longitude andLatitude:latitude];
}
在完成网络服务请求后,我停止了后台任务,如下所示
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
如果我在完成 Web 服务请求后没有停止后台任务,一切都会按预期工作(能够获得位置更改通知)。但是,如果我在完成请求后停止了后台任务,则在应用程序处于后台时,我无法获得位置更改通知,并且状态栏中的位置服务图标消失.....
我已经搜索了很多来解决问题...这是在后台获取位置更改并更新服务器更改的正确方法吗?如果没有,有人可以提出更好的方法吗?非常感谢任何帮助.....
Best Answer-推荐答案 strong>
如果您想在应用程序处于后台时更新位置变化,Apple 要求您在 info.plist 中指定应用程序的后台模式(本例中为 location)。
您需要使用的 key 是 UIBackgroundModes
关于iphone - 在后台无法获取位置更改通知,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/15767989/
|