无法结束后台任务:不存在标识符为 * 的后台任务,或者它可能已经结束

Can't endBackgroundTask: no background task exists with identifier *, or it may have already been ended

我的应用通过以下方式监控用户位置更新(不一定是重大位置变化):

someLocationManager = [[CLLocationManager alloc] init];
[someLocationManager setDelegate:self];
[someLocationManager startUpdatingLocation];

当应用程序(在模拟器中)在前台时一切正常,但是当它暂停到后台(不终止)时,我在日志中收到此错误:

Can't endBackgroundTask: no background task exists with identifier *, or it may have already been ended

此错误的所有其他答案都与定位服务无关,只是一般的后台任务问题。

因此看来应该进行以下 3 项设置才能使后台位置更新正常工作。 这样做并解决问题:

  1. info.plist.
  2. 中设置 NSLocationAlwaysUsageDescription 密钥(以值作为许可的原因)
  3. 确保在请求许可时调用 [someLocationManager requestAlwaysAuthorization];
  4. 在目标设置的 Capabilities 部分的 Background Modes 中启用 Location Updates。不确定这个,但听起来不错。

尽情享受吧!

在获取用户位置授权时添加以下代码。因为苹果改变了默认的 allowsBackgroundLocationUpdates NO 从 iOS9.

'if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    locationManager.allowsBackgroundLocationUpdates = YES;
}'