不能终止 BackoundTask: 没有带标识符的后台任务,或者它可能已经结束

我使用后台任务在后台运行计时器来更新用户的位置,它被声明为:

UIBackgroundTaskIdentifier bgTask;

在头文件中,并初始化为:

bgTask = UIBackgroundTaskInvalid;

但是,我仍然从广东发展银行得到这样的信息:

不能终止 BackoundTask: 标识符为23dc 的后台任务不存在,或者它可能已经结束。在 UIApplicationEndBackoundTaskError ()中断以进行调试。

为什么,我要怎么解决这个问题?

70637 次浏览

你得准备好 无效

马上就好

  1. 在过期处理程序中。
  2. 在完成你的任务之后。

我相信你错过了这两个时刻中的任何一个,这就是为什么你会得到那个错误。

参见苹果示例代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];


// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{


// Do the work associated with the task, preferably in chunks.


[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}

连结: Https://developer.apple.com/documentation/backgroundtasks/bgtask?language=objc

你在后台使用位置更新吗?

如果是,在获得用户的位置授权时添加以下代码-苹果从 iOS9开始将 allowsBackgroundLocationUpdates的默认设置改为 NO

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

请确保您在您的项目“签名和能力”下激活了背景模式的“位置更新”。否则它会崩溃。

在 Xcode,切换到断点导航器(查看 > 导航器 > 显示断点导航器) ,然后按左下角的 + 按钮,选择添加符号断点,并输入“ UIApplicationEndBackoundtaskError”作为符号。

在调试控制台 无法结束 BackoundTask: 没有标识符2(0x2)的后台任务,或者它可能已经结束。在 UIApplicationEndBackoundTaskError ()中断以进行调试中,我花了很多时间寻找导致这个警告的代码或框架。

最后,我创建了一个空项目 单视图应用程序。只有 Xcode 生成的代码,我在模拟器上运行应用程序,把它放在后台,我看到同样的警告。 所以我可以说这是 iOS13的问题。 我希望苹果能尽快解决这个问题,因为在 Crashlytics,我发现我的应用程序因此崩溃了。

使用 Swift 5-IOS 13.2.2-Xcode 11.2 beta 2(11B44) 我设法消除了这个错误

  • 在应用程序的功能中启用推送通知

  • 导入 UserNotification 框架

  • 然后将此代码添加到

Func application (_ application: UIApplication, 返回文章页面选项: [ UIApplication.LaunchOptionsKey: Any ] ?-> Bool {

  let center = UNUserNotificationCenter.current()
center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in


// If granted comes true you can enabled features based on authorization.
guard granted else { return }
DispatchQueue.main.async {
application.registerForRemoteNotifications()
}
}

我认为使用 xcode 11.2和 Swift UI 框架有一个 bug,因为我总是得到

”无法结束后台任务: 不存在 标识符...”

即使我的应用程序不与后台任务工作的消息! 好消息是,这只会在从 xcode 执行时停止我的应用程序; 使用“继续程序执行”按钮,应用程序将再次运行。

关于“不能结束 BackoundTask: 没有带标识符的后台任务存在...”消息,正如其他人所说,这可能是一个转移注意力的信息,与您正在做的事情无关。

考虑到你的目标是定期检索用户的位置,而不是试图让你的应用程序在后台运行,你应该利用各种 在后台更新用户位置服务,比如 参观位置服务或者 重大变更定位服务。有了这些服务,当用户的位置发生变化时,操作系统可以唤醒你的应用程序。

复制,这是我的整个应用程序:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
{
return true
}
}

当我把它带到背景时,我得到同样的信息。没有故事板或任何其他噪音。

我也遇到了同样的问题,并且找到了原因和解决办法!

苹果已经在 iOS13.4 GM 中解决了这个问题,尽管我已经为早期版本做了变通。

当你的应用程序在 iOS13或更高版本下运行时,你应该接受使用场景,当你仍然支持 iOS12或更高版本时,你可以完全选择退出。

  1. 首先,从 Info.plist 中完全删除“ Application Scene Manifest”条目。
  2. 如果有一个场景委托类,删除它。
  3. 如果在你的应用程序委托中有任何与场景相关的方法,删除这些方法。
  4. 如果缺少,将属性 var window: UIWindow?添加到应用程序委托中。
  5. 您的应用程序现在应该只使用应用程序委托,在 iOS13下,它应该具有与 iOS12相同的生命周期。

编程愉快!

这个问题已经在 iOS 13.4 GM 中得到解决。

Https://developer.apple.com/forums/thread/121990