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

Posted

技术标签:

【中文标题】在后台无法获取位置更改通知【英文标题】:Not able to get location change notification while in background 【发布时间】:2013-04-02 15:24:15 【问题描述】:

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

- (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) 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 服务请求后没有停止后台任务,一切都会按预期工作(能够获得位置更改通知)。但是,如果我在完成请求后停止了后台任务,则在应用程序处于后台时,我无法获得位置更改通知,并且状态栏中的位置服务图标消失.....

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

【问题讨论】:

【参考方案1】:

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

您需要使用的密钥是UIBackgroundModes

【讨论】:

感谢您的友好回复,但在苹果关于“位置感知编程指南”的文档中启用“UIBackgroundModes”毫无意义。由于在 plist 中启用了“UIBackgroundModes”,我的应用程序被拒绝了......有什么想法吗? 如果您需要您的应用在后台获取位置更改(并以某种方式处理或使用它),您需要启用后台模式。 Apple 拒绝具有后台模式的应用程序,这些应用程序只是将其放在那里(以确保应用程序继续在 bkg 中运行)但实际上并没有使用该模式。 我正在 locationManager:didUpdateToLocation:fromLOcation 方法中将位置更新到数据库,它按预期工作正常..还有什么要实现的吗?

以上是关于在后台无法获取位置更改通知的主要内容,如果未能解决你的问题,请参考以下文章

当位置发生变化并且我的应用程序处于后台时,我可以获得本地通知吗?

需要在我的应用程序在后台时获取我的位置

在位置后台模式下从核心数据访问数据

本地通知在 iOS 10.3.1 中不起作用

无法在后台服务中使用 LocationManager 获取位置

无法在 iOS 11 上获取后台位置更新