【问题标题】:Can't endBackgroundTask: no background task exists with identifier, or it may have already been endedCan't endBackgroundTask:不存在具有标识符的后台任务,或者它可能已经结束
【发布时间】:2014-07-15 22:58:52
【问题描述】:

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

UIBackgroundTaskIdentifier bgTask;

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

bgTask = UIBackgroundTaskInvalid;

但是,我仍然在 gdb 中收到这条消息:

无法结束BackgroundTask:不存在标识符为 23dc 的后台任务,或者它可能已经结束。中断 UIApplicationEndBackgroundTaskError() 进行调试。

为什么?我该如何解决这个问题?

【问题讨论】:

标签: objective-c ios7 xcode5


【解决方案1】:

这已在 iOS 13.4 GM 中修复。

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

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
【解决方案2】:

我遇到了同样的问题,并找出原因和解决方案!

Apple 已在 iOS 13.4 GM 中修复了此问题,尽管我为早期版本提供了解决方法。

虽然您应该在您的应用在 iOS 13 及更高版本下运行时使用场景,但您可以在仍支持 iOS 12 或更低版本时完全退出。

  1. 首先,从 Info.plist 中彻底删除“Application Scene Manifest”条目。
  2. 如果有场景委托类,请将其删除。
  3. 如果您的应用委托中有任何与场景相关的方法,请移除这些方法。
  4. 如果缺少,请将属性 var window: UIWindow? 添加到您的应用委托。
  5. 您的应用现在应该只使用应用委托,并且在 iOS 13 下它应该具有与 iOS 12 相同的生命周期。

编码愉快!

【讨论】:

    【解决方案3】:

    我认为 xcode 11.2 和 swiftUI 框架存在错误,因为我总是得到 ​​p>

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

    即使我的应用程序没有处理后台任务也能发送消息! 好消息是,这只会在从 xcode 执行时停止我的应用程序;使用“继续执行程序”按钮,应用程序将再次运行。

    【讨论】:

    • 这不是你所说的崩溃,而是一个断点,当应用程序停止调试时。很可能您已经为UIApplicationEndBackgroundTaskError 设置了断点。
    • 你说得对,这不是崩溃,但我没有设置断点。
    【解决方案4】:

    转载,这是我的整个应用程序:

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

    当我把它放到后台时,我得到了同样的信息。没有故事板或任何其他噪音。

    【讨论】:

      【解决方案5】:

      关于“无法结束BackgroundTask:不存在具有标识符...的后台任务”消息,正如其他人所说,这可能是一个红鲱鱼,与您正在做的事情无关。

      关于您尝试定期检索用户位置的目标,而不是尝试使用计时器让您的应用在后台运行,您应该利用updating the user location in the background 的各种服务,例如visits location servicesignificant change location service。借助这些服务,操作系统可以在用户位置发生变化时唤醒您的应用。

      【讨论】:

      • 我也收到此警告,据我所知,我的简单笔记应用程序没有任何后台任务。例如,当用户点击网页 URL 并打开 safari 时,我会收到警告。我应该寻找哪些红鲱鱼。或者,我可以查看一些资源以了解更多信息?
      • 我不知道任何详尽的清单,因为它们是多种多样的。而当你开始使用第三方库时,情况会变得更糟。维护一份清单可能是徒劳的。哈哈。对我来说,我通常只是在 Stack Overflow 或通用网络搜索引擎中搜索任何特定的控制台消息,并且经常会找到与此类似的讨论。您很快就能掌握与您自己的代码无关的内容。对于我的日志记录,我使用带有字符串“category”的OSLog 的Unified Logging,然后我可以轻松地在控制台中对其进行过滤,从而将小麦与谷壳分开。
      【解决方案6】:

      您需要设置 bgTask = UIBackgroundTaskInvalid

      两分钟后

      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

      【讨论】:

      • 它不会让我这样做,它说:ARC 不允许将“UIBackgroundTaskIdentifier”(又名“unsigned long”)隐式转换为“BGAppRefreshTask *”
      【解决方案7】:

      使用 Swift 5 - IOS 13.2.2 - Xcode 11.2 beta 2 (11B44) 我设法通过

      摆脱了这个错误
      • 在应用的功能中启用推送通知

      • 导入 UserNotifications 框架

      • 然后将此代码添加到

      func 应用程序(_ 应用程序:UIApplication, didFinishLaunchingWithOptions 启动选项: [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()
                  }
              }
      

      【讨论】:

      • 在我使用 iOS 13.2.2 和 Xcode 11.2.1 的真实设备上没有解决问题
      • 在 iOS 13.3.1、swift 5、Xcode 11.3.1 上也没有解决问题
      • 如果您只注册静默(后台)通知,则您的第 2 步和第 3 步是没有必要的
      【解决方案8】:

      我花了很多天在调试控制台中寻找导致此警告的代码或框架无法结束 BackgroundTask:不存在标识符为 2 (0x2) 的后台任务,或者它可能已经存在结束了。中断 UIApplicationEndBackgroundTaskError() 进行调试

      最后我创建了一个空项目Single View App。只有 Xcode 生成的代码,我在模拟器上运行应用程序,把它放在后台,我看到了同样的警告。 所以我可以说这是 iOS 13 的问题。 我希望 Apple 能迅速修复它,因为在 Crashlytics 中我发现我的应用程序出现了一些由它引起的崩溃。

      【讨论】:

      • 我看到了同样的问题。不确定这是否真的是 iOS 13 问题。感谢您是否可以将您的 Single View App 放在某个地方进行复制。谢谢。
      • 我在添加涉及通知中心和用户默认值的代码后开始收到消息。当我离开应用程序时,我会收到消息。
      • 在 iOS 13 上遇到同样的问题。我正在为 AVAudioPlayer 使用后台模式,它在 iOS 12 上运行良好。
      • 我的应用也在后台模式下使用 AVAudioPlayer,但是这个警告是在一个空的新项目中给出的。 @beshio 如果你想尝试打开 XCode 11,文件 -> 新项目 -> 单视图应用程序,运行,你会发现它
      • 我在 iOS 13 上遇到了同样的问题。我正在使用 BackgroundTasks 框架。当我的应用进入后台时显示。
      【解决方案9】:

      您是否在后台使用位置更新?

      如果是,请在从用户获取位置授权时添加以下代码 - Apple 从 iOS 9 开始将 allowsBackgroundLocationUpdates 的默认值更改为 NO

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

      请确保您在项目“签名和功能”下为后台模式激活了“位置更新”。否则会崩溃。

      【讨论】:

        【解决方案10】:

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

        【讨论】:

        • 这让我进入了正确的领域。谢谢。但它指向 google firebase 消息传递,因此无法直接在应用程序中修复。
        • 是的。我有同样的问题,谷歌 Firebase 消息系统。 iOS 13.x 有很多问题,所有应用都面临随机后台崩溃。
        • 对我来说它停在 UIKitCore,所以看起来像 Apple 错误
        • @IslamQ 你解决过这个问题吗?我有完全相同的问题。断点在 UIKitCore 处停止。
        • @thecloud_of_unknowing 不,我暂时忽略了它
        猜你喜欢
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 2020-05-26
        • 2019-05-14
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        相关资源
        最近更新 更多