我正在使用后台任务在后台运行计时器来更新用户的位置。它被声明为:
UIBackgroundTaskIdentifier bgTask;
在头文件中,并初始化为:
bgTask = UIBackgroundTaskInvalid;
但是,我仍然在gdb中收到此消息:
无法endBackgroundTask:没有标识符为23dc的后台任务,或者它可能已经结束。中断UIApplicationEndBackgroundTaskError()以进行调试。
为什么呢?我该如何解决这个问题?
答案 0 :(得分:44)
我花了很多时间在调试控制台中寻找导致此警告的代码或框架无法结束BackgroundTask:不存在标识符为2(0x2)的后台任务,或者可能已经结束了。中断UIApplicationEndBackgroundTaskError()进行调试。
最后,我创建了一个空项目 Single View App 。仅由Xcode生成的代码,我在模拟器上运行该应用程序,将其置于后台,并且看到相同的警告。 所以我可以说这是iOS 13问题。 我希望苹果能够迅速修复它,因为在Crashlytics中,我发现了由它引起的应用崩溃。
答案 1 :(得分:13)
在Xcode中,切换到断点导航器(“视图”>“导航器”>“显示断点导航器”),然后按左下角的+按钮并选择“添加符号断点”,然后输入“ UIApplicationEndBackgroundTaskError”作为符号。
答案 2 :(得分:6)
转载,这是我的整个应用程序:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
{
return true
}
}
当我将它带到后台时,我会收到相同的消息。没有情节提要或任何其他噪音。
答案 3 :(得分:4)
你需要设置 bgTask = UIBackgroundTaskInvalid
两刻
我相信你错过了这两个时刻中的任何一个,这就是你得到这个错误的原因。
参见apple示例代码:
- (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;
});
}
答案 4 :(得分:3)
您是否在后台使用位置更新?
如果是,请在获取用户的位置授权时添加以下代码 - Apple将iOS {9}的默认值从iOS 9更改为allowsBackgroundLocationUpdates
。
NO
答案 5 :(得分:1)
所以bgTask的工作原理如下:
bgTask = [application beginBackgroundTaskWithName:kBGTaskName expirationHandler:^{}
在街区内完成你的工作。
如果你在块中放置一个断点,做一些工作并让它运行,你也会收到Can&#t endBackgroundtask错误,就像在10秒左右之后说的那样。而不是断点,放一个NSLog并检查。它应该工作得很好。
答案 6 :(得分:1)
使用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()
}
}
答案 7 :(得分:1)
关于“无法结束BackgroundTask:不存在带有标识符...的后台任务”消息,正如其他人所说,这可能是一个红色鲱鱼,与您的工作无关。
关于尝试定期检索用户位置的目标,而不是尝试使应用程序在后台运行,而不是使用计时器,您应该利用updating the user location in the background的各种服务,例如{{ 3}}或visits location service。借助这些服务,当用户位置发生变化时,操作系统可以唤醒您的应用。
答案 8 :(得分:1)
我遇到了同样的问题,并找出了原因和解决方案!
尽管我已经解决了早期版本,但Apple已在iOS 13.4 GM中修复了此问题。
当您的应用程序在iOS 13及更高版本下运行时,虽然您应该拥抱使用场景,但是在您仍支持iOS 12或更早版本的情况下,您可以完全选择退出。
Application Scene Manifest
”条目。var window: UIWindow?
添加到您的应用程序委托中。祝您编程愉快!
答案 9 :(得分:-1)
我认为使用xcode 11.2和swiftUI框架存在一个错误,因为我总是得到
“无法结束BackgroundTask: 标识符...”
即使我的应用程序无法使用后台任务,也可以发送消息! 好消息是,这只会在从xcode执行时使我的应用程序崩溃;使用“继续执行程序”按钮,该应用将再次运行。