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

Posted

技术标签:

【中文标题】Can\'t endBackgroundTask:不存在标识符为 * 的后台任务,或者它可能已经结束【英文标题】:Can't endBackgroundTask: no background task exists with identifier *, or it may have already been endedCan't endBackgroundTask:不存在标识符为 * 的后台任务,或者它可能已经结束 【发布时间】:2015-06-18 12:58:11 【问题描述】:

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

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

当应用程序(在模拟器中)处于前台时,一切正常,但是当将其挂起到后台(未终止)时,我在日志中收到此错误:

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

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

【问题讨论】:

发布您自己的问题/答案很好,但至少让您的“问题”成为一个实际问题。无需提及您将回答自己的问题。 我认为表现得像一个真正的问题没有任何好处。提出一个真正的问题——这就是重点,所以我做到了。 【参考方案1】:

因此,为了使后台位置更新正常工作,似乎应该进行以下 3 项设置。 这样做并解决问题:

    info.plist 中设置NSLocationAlwaysUsageDescription 键(以值作为许可的原因)。 请求许可时请务必致电[someLocationManager requestAlwaysAuthorization];。 在目标设置的Capabilities 部分中的Background Modes 中启用Location Updates。不确定这个,但听起来不错。

享受吧!

【讨论】:

@AshishKakkad 很好。 您没有提到发布的三个步骤是否确实修复了错误。是吗? "...应该进行以使后台位置更新正常工作",所以是的,它解决了问题。我对其进行了编辑以使其更清晰。【参考方案2】:

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

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

【讨论】:

以上是关于Can't endBackgroundTask:不存在标识符为 * 的后台任务,或者它可能已经结束的主要内容,如果未能解决你的问题,请参考以下文章

endBackgroundTask:导致“由于信号 9 而终止”

beginBackgroundTaskWithExpirationHandler 调用 endBackgroundTask 但未结束进程

iOS后台任务beginBackgroundTask和endBackgroundTask成对出现

Can't install pip with get-pip, zipimport.ZipImportError: can't decompress data; zlib 不可用

iptables v1.4.14: can't initialize iptables table `nat': 表不存在(需要insmod吗?)

can't install specific old version of sklearn to解决pyadio分析库中不兼容的“SVC属性错误”