我正在使用后台任务在后台运行计时器以更新用户的位置。声明为:
UIBackgroundTaskIdentifier bgTask;
在头文件中,并初始化为:
bgTask = UIBackgroundTaskInvalid;
但是,我仍然在gdb中收到此消息:
无法endBackgroundTask:不存在标识符为23dc的后台任务,或者它可能已经结束。中断UIApplicationEndBackgroundTaskError()进行调试。
为什么?我该如何解决呢?
Answers:
我花了很多时间在调试控制台中寻找导致此警告的代码或框架。无法结束BackgroundTask:不存在标识符为2(0x2)的后台任务,或者它可能已经结束。中断UIApplicationEndBackgroundTaskError()以进行调试。
最后,我创建了一个空项目Single View App。仅由Xcode生成的代码,我在模拟器上运行该应用程序,将其置于后台,并且看到相同的警告。所以我可以说这是iOS 13问题。我希望苹果能够迅速修复它,因为在Crashlytics中,我发现了由它引起的应用崩溃。
在Xcode中,切换到断点导航器(“视图”>“导航器”>“显示断点导航器”),然后按左下角的+按钮并选择“添加符号断点”,然后输入“ UIApplicationEndBackgroundTaskError”作为符号。
您需要设置bgTask = UIBackgroundTaskInvalid
一会儿
我相信您错过了这两个时刻中的任何一个,这就是为什么您会收到该错误。
请参阅苹果示例代码:
- (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
转载,这是我的整个应用程序:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
{
return true
}
}
当我将它带到后台时,我会收到相同的消息。没有情节提要或任何其他噪音。
使用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()
}
}
OSLog
带有字符串“ category”的字符串一起使用,然后可以在控制台中轻松进行过滤,从而将小麦与谷壳分开。
我遇到了同样的问题,并找出了原因和解决方案!
苹果已经在iOS 13.4 GM中修复了此问题,尽管我有较早版本的解决方法。
当您的应用程序在iOS 13及更高版本下运行时,虽然您应该拥抱使用场景,但是在仍然支持iOS 12或更早版本的情况下,您可以完全选择退出。
Application Scene Manifest
从Info.plist中完全删除“ ”条目。var window: UIWindow?
到您的应用程序委托中。祝您编码愉快!