在后台无法获得位置更改通知

时间:2013-04-02 15:24:15

标签: iphone ios objective-c core-location cllocationmanager

我的应用需要在后台使用的位置服务。所以我添加了以下方法

- (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文档,它说app会在位置发生变化时收到通知,即调用- (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation委托方法。

为了进行一些后台处理(扩展处理时间),我在上面指定的委托方法中添加了ExpirationHandler,如下所示

- (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)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];
}

在完成Web服务请求后,我已按如下方式停止后台任务

[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;

如果我在完成Web服务请求后没有停止后台任务,那么每件事都会按预期工作(能够获得位置变更通知)。但是如果我在完成请求后停止后台任务,我就无法获得位置更改通知,状态栏中的位置服务图标会在应用程序处于后台时消失.....

我已经搜索了很多来修复问题...这是获取位置更改并在后台更新服务器的正确方法吗?如果没有,任何人都可以提出更好的方法吗?非常感谢任何帮助.....

1 个答案:

答案 0 :(得分:1)

如果您希望在应用处于后台时更新位置更改,Apple会要求您在info.plist中指定应用的背景模式(在这种情况下为位置)。

您需要使用的密钥为UIBackgroundModes