应用程序在后台模式下仅在 iOS 13 上崩溃

Posted

技术标签:

【中文标题】应用程序在后台模式下仅在 iOS 13 上崩溃【英文标题】:App is crashing on only iOS 13 in the background mode 【发布时间】:2020-05-30 21:46:55 【问题描述】:

该应用仅在 ios 13 上崩溃,当我看到详细报告时,报告提到该应用在崩溃时处于后台。没有参考崩溃日志中提到的代码行,我可以在其中找到导致崩溃的行。请建议其他人是否也遇到过此类问题。

崩溃:com.apple.main-thread

EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000f5e5f9c3c

Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x1aed79d10 objc_opt_respondsToSelector + 20
1  Foundation                     0x1af423588 _NSDescriptionWithStringProxyFunc + 56
2  CoreFoundation                 0x1aefdc534 __CFStringAppendFormatCore + 7960
3  CoreFoundation                 0x1aefddb10 _CFStringCreateWithFormatAndArgumentsAux2 + 152
4  Foundation                     0x1af2f63c4 +[NSString stringWithFormat:] + 72
5  UIKitCore                      0x1b30d95d8 -[_UIBackgroundTaskInfo description] + 144
6  UIKitCore                      0x1b30e302c _fireBackgroundExpirationHandlers + 1068
7  UIKitCore                      0x1b30e2b2c -[UIApplication workspaceNoteAssertionExpirationImminent:] + 136
8  FrontBoardServices             0x1b41adc50 __45-[FBSUIApplicationWorkspaceShim setDelegate:]_block_invoke_3 + 48
9  libdispatch.dylib              0x1aed01524 _dispatch_client_callout + 16
10 libdispatch.dylib              0x1aecaa434 _dispatch_block_invoke_direct$VARIANT$mp + 224
11 FrontBoardServices             0x1b41fe440 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 40
12 FrontBoardServices             0x1b41fe10c -[FBSSerialQueue _queue_performNextIfPossible] + 404
13 FrontBoardServices             0x1b41fe634 -[FBSSerialQueue _performNextFromRunLoopSource] + 28
14 CoreFoundation                 0x1aefb9b64 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
15 CoreFoundation                 0x1aefb9abc __CFRunLoopDoSource0 + 80
16 CoreFoundation                 0x1aefb9244 __CFRunLoopDoSources0 + 184
17 CoreFoundation                 0x1aefb4274 __CFRunLoopRun + 788
18 CoreFoundation                 0x1aefb3c34 CFRunLoopRunSpecific + 424
19 GraphicsServices               0x1b90fd38c GSEventRunModal + 160
20 UIKitCore                      0x1b30e622c UIApplicationMain + 1932
21 MagicBox Learning              0x104644058 main + 14 (main.m:14)
22 libdyld.dylib                  0x1aee3b800 start + 4



这就是我在 beginBackgroundTask(expirationHandler:) 中所做的。请纠正我在这里做错了什么。


- (void)applicationDidEnterBackground:(UIApplication *)application 

    self.isAppLaunched      =   NO;

    _bgTask = [application beginBackgroundTaskWithExpirationHandler:^
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.

        [self cancelAllProductDownloadsInProgress];

        dispatch_async(_MAGICBOX.databaseQueue, ^
            [application endBackgroundTask:self.bgTask];
            self.bgTask = UIBackgroundTaskInvalid;
        );
    ];

    //Dismiss keyboard
    [self.window endEditing:YES];


【问题讨论】:

看看你是否在可能相关的代码中调用stringWithFormat anywhere。 【参考方案1】:

关键行是workspaceNoteAssertionExpirationImminent。您正在请求一个后台任务(可能是beginBackgroundTask(expirationHandler:)),当它到期时,您没有进行正确的清理。因此,您的应用会受到被杀死的惩罚。

【讨论】:

但这仅出现在 iOS 13 中,而不是以前版本中报告的单个实例。另外,我该如何进行适当的清理? ***.com/questions/10319643/… 感谢@matt 的回答,但我仍然很困惑为什么这只会出现在 iOS 13 版本中。而在低于 iOS 13 的版本上也不会崩溃。 现在你已经展示了你的实现,它证实了,正如我告诉你的,你的实现是完全错误的。我应该会看到 两个 调用application endBackgroundTask,一个用于您成功完成任务时,另一个用于您的时间用完。我在之前的评论中给你的链接会告诉你后台任务的正确结构。使用该结构,不要使用其他结构。 至于为什么这在 iOS 13 之前的版本上不会给您带来麻烦...这不是我(或您)真正关心的问题,但一个原因可能是在 iOS 13 之前您有更多时间完成你的后台任务,这样你的时间就不会过期。

以上是关于应用程序在后台模式下仅在 iOS 13 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Crashlytics 线程仅在使用 Xcode 11 构建的 iOS 13 上崩溃

仅在 iOS 14 中崩溃核心数据

React-native-agora 音频仅在后台模式下无法在前台模式下工作(iOS)

iPhone 应用程序仅在 3G 上的发布模式下崩溃

我的应用在 iOS 4.3 上崩溃,但仅在从 App Store 下载时

iOS - 如果仅在设备上运行,我的应用程序会因内存错误而崩溃