2

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

- (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];
}

根据苹果的文档,它说当位置发生变化时应用程序会收到通知,即- (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];
}

完成网络服务请求后,我停止了后台任务,如下所示

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

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

我进行了很多搜索以解决问题...这是在后台获取位置更改并更新对服务器的更改的正确方法吗?如果没有,有人可以提出更好的方法吗?任何帮助是极大的赞赏.....

4

1 回答 1

1

如果您想在应用程序处于后台时更新位置更改,Apple 要求您在 info.plist 中指定应用程序的后台模式(在本例中为位置)。

他们需要使用的关键是UIBackgroundModes

于 2013-04-02T15:45:52.020 回答