ios - 后台线程崩溃

标签 ios swift grand-central-dispatch

当我在后台模式下获取应用程序时,应用程序崩溃并显示以下日志。

这是崩溃的设备日志:

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace ASSERTIOND, Code 0x8badf00d
Triggered by Thread:  0

Filtered syslog:
None found

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib        0x0000000183563de8 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000183563c60 mach_msg + 72
2   CoreFoundation                  0x0000000183aa6e40 __CFRunLoopServiceMachPort + 196
3   CoreFoundation                  0x0000000183aa4908 __CFRunLoopRun + 1568
4   CoreFoundation                  0x00000001839c4da8 CFRunLoopRunSpecific + 552
5   GraphicsServices                0x00000001859aa020 GSEventRunModal + 100
6   UIKit                           0x000000018d9e4758 UIApplicationMain + 236
7   AijouNetto                      0x00000001008a851c main + 410908 (AppDelegate.swift:17)
8   libdyld.dylib                   0x0000000183455fc0 start + 4 

这个类的实现:

class EKNBackgroundTaskManager {

let backgroundDQ = DispatchQueue.global(qos: .background)
var backgroundUpdateTask: UIBackgroundTaskIdentifier!

init(withName: String) {

    self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(withName: withName) {}
}

func runBackgroundTask(withCode: @escaping (_ cH: @escaping () -> Void) -> Void)
{
    backgroundDQ.async {
        withCode() {
            self.endBackgroungTask()
        }
    }
}

func endBackgroungTask() {
    if backgroundUpdateTask != nil && backgroundUpdateTask != UIBackgroundTaskInvalid {
        UIApplication.shared.endBackgroundTask(backgroundUpdateTask)
        backgroundUpdateTask = UIBackgroundTaskInvalid
    }
  }
}

有什么建议可以在应用程序进入后台模式时修复此错误?

最佳答案

您的应用程序在后台占用过多时间或启动时间过长,因此被 iOS 看门狗进程终止(仅发生在设备上)。 这可以从终止原因代码中看出。 有关更多信息,请参阅此帖子:What does 8badf00d mean?

您应该检查导致崩溃的是开始时间还是后台任务。如果是开始时间,您必须以某种方式减少您的应用程序启动时间。 Apple 就此主题进行了多次演讲,相应的视频可以在 Apple Developer 平台上找到(在过去几年的 WWDC 视频中,例如这个:https://developer.apple.com/videos/play/wwdc2016/406)。

有关长时间运行的后台任务以及如何实现它们,请参阅 Apple 文档:https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW3

关于ios - 后台线程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52983806/

相关文章:

swift - 循环中的异步 DispatchQueue

ios - 为什么有些库需要嵌入而有些不需要?

ios - 在 Siri 套件中创建通用/动态自定义意图?

json - 使用 Swifty 将 JSON 和 String 合并到字典中

ios - 如果我的 DispatchGroup 从未完成会发生什么

ios - block 指针变量 'block' 在被 block 捕获时未初始化

android - 适用于移动设备或特定于移动设备的 Web 应用程序

ios - 并非所有 NSOperations 返回值

ios - 如何使用其命名空间(或框架名称)将 Swift 类型名称作为字符串获取

ios - swift - ManagedObjectContext 中的 CoreData 为零