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

raj*_*raj 30 objective-c ios7 xcode5

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

UIBackgroundTaskIdentifier bgTask;
Run Code Online (Sandbox Code Playgroud)

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

bgTask = UIBackgroundTaskInvalid;
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 30

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

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

  • 在 iOS 13 上遇到同样的问题。我正在使用 AVAudioPlayer 的后台模式,它在 iOS 12 上运行良好。 (7认同)
  • 添加涉及通知中心和用户默认值的代码后,我开始收到消息。我离开应用程序时收到消息。 (2认同)
  • 我在iOS 13上遇到相同的问题。我正在使用BackgroundTasks框架。我显示我的应用何时进入后台。 (2认同)

Sal*_*tan 10

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

  • 对我来说它停在 UIKitCore 处,所以看起来像 Apple bug (5认同)
  • 是。我遇到了同样的问题,即Google Firebase邮件系统。iOS 13.x存在很多问题,所有应用程序都面临随机背景崩溃。 (2认同)

Jul*_*rio 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;
    });
}
Run Code Online (Sandbox Code Playgroud)

链接:https//developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html


Han*_*kke 6

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

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

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


Ana*_*777 5

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

如果是,在从用户获取位置信息授权的时候添加下面的代码-苹果改变了默认为allowsBackgroundLocationUpdatesNO从iOS的9起。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    locationManager.allowsBackgroundLocationUpdates = YES;
}
Run Code Online (Sandbox Code Playgroud)

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