应用程序在后台模式下仅在 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 上崩溃
React-native-agora 音频仅在后台模式下无法在前台模式下工作(iOS)