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


77

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

UIBackgroundTaskIdentifier bgTask;

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

bgTask = UIBackgroundTaskInvalid;

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

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

为什么?我该如何解决呢?


Answers:


95

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

最后,我创建了一个空项目Single View App。仅由Xcode生成的代码,我在模拟器上运行该应用程序,将其置于后台,并且看到相同的警告。所以我可以说这是iOS 13问题。我希望苹果能够迅速修复它,因为在Crashlytics中,我发现了由它引起的应用崩溃。


1
我看到了同样的问题。不知道这是否真的是iOS 13问题。感谢您是否可以将Single View应用放在某个地方进行复制。谢谢。
beshio

7
添加涉及通知中心和用户默认值的代码后,我开始收到消息。我离开应用程序时收到消息。
hashemi

7
在iOS 13上也遇到同样的问题。我正在为AVAudioPlayer使用背景模式,在iOS 12上运行良好
。– ChuckZHB

1
我的应用程序也在后台模式下使用AVAudioPlayer,但是此警告是由一个空的新项目给出的。@beshio,如果您想尝试打开XCode 11,File-> New Project-> Single View App,运行,您会发现它
Francesco Ceravolo 19-10-23

6
我在iOS 13上遇到相同的问题。我正在使用BackgroundTasks框架。我显示我的应用何时进入后台。
Gurjinder Singh,

32

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


1
这使我进入了正确的领域。谢谢。但是它指向的是Google Firebase消息传递,因此无法直接在应用程序中进行修复。
米卡·蒙托亚

5
是。我遇到了同样的问题,即Google Firebase邮件系统。iOS 13.x存在很多问题,所有应用程序都面临随机后台崩溃。
萨利赫苏丹(Saleh Sultan),

5
对我来说,它停止在UIKitCore上,所以看起来像是Apple Bug
Islam

@IslamQ您是否解决了这个问题?我有完全相同的问题。断点在UIKitCore处停止。
thecloud_of_unknowing

@thecloud_of_unknowing不,我现在暂时忽略了它
伊斯兰教

11

您需要设置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 *”
Jackson

5

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

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

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

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


5

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

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

当我将它带到后台时,我会收到相同的消息。没有情节提要或任何其他噪音。


3

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

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

  • 导入UserNotifications框架

  • 然后将此代码添加到

func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey:Any]?)->布尔{

  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()
            }
        }

3
不能在使用iOS 13.2.2和Xcode 11.2.1的真实设备上解决问题
Adam Smaka

不能在iOS 13.3.1,swift 5,Xcode 11.3.1上解决问题
user3069232

如果仅注册静默(后台)通知,则无需执行步骤2和步骤3 。
LukeSideWalker

1

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

关于尝试定期检索用户位置的目标,而不是尝试使用计时器使应用程序在后台运行,您应该利用各种服务来在后台更新用户位置,例如访问位置服务重大变更位置服务。借助这些服务,当用户位置发生变化时,操作系统可以唤醒您的应用程序。


我也收到此警告,据我所知,我没有简单的记笔记应用程序来执行任何后台任务。例如,当用户点击一个网址并打开safari时,我会收到警告。我应该寻找哪些红鲱鱼。或者,我可以签出一些资源以了解更多信息?
Mox

我不知道任何详尽的清单,因为它们种类繁多。并且当您开始使用第三方库时,情况变得更糟。维护列表很可能是徒劳的。大声笑。对我来说,我通常只搜索Stack Overflow或通用的Web搜索引擎以查找任何特定的控制台消息,并且经常会发现与这一内容没有什么不同的讨论。您很快就可以解决与您自己的代码无关的问题。对于日志记录,我将统一日志记录与OSLog带有字符串“ category”的字符串一起使用,然后可以在控制台中轻松进行过滤,从而将小麦与谷壳分开。
罗布

1

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

苹果已经在iOS 13.4 GM中修复了此问题,尽管我有较早版本的解决方法。

当您的应用程序在iOS 13及更高版本下运行时,虽然您应该拥抱使用场景,但是在仍然支持iOS 12或更早版本的情况下,您可以完全选择退出。

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

祝您编码愉快!


0

我认为使用xcode 11.2和swiftUI框架存在一个错误,因为我总是得到

“无法结束BackgroundTask:不存在带有标识符的后台任务...”

消息,即使我的应用程序无法使用后台任务也是如此!好消息是,这仅在从xcode执行时停止我的应用;使用“继续执行程序”按钮,该应用将再次运行。


当您停止调试应用程序时,这不是您要谈论的崩溃,而是断点。您很可能已经为设置了断点UIApplicationEndBackgroundTaskError
Starsky

没错,这不是崩溃,但是我没有设置断点。
abanet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.