An app which was running successfully on iOS 9-15 now crashes on launch on iOS 9-12 when building with Xcode 13.1 (on M1 Pro) that I just upgraded to.
It crashes on unarchive of the main storyboard due to use of UITabBarAppearance which only exists on iOS 13+ (see trace below). My storyboard entry point is a Tab Bar Controller.
I have not edited my storyboard file since this was working on iOS 9-15 with previous Xcode versions and the crash occurs before any of my code runs.
In the hope it was a simulator-only issue (I have no old-iOS devices) I uploaded to the store but the app crashes on launch on real devices too on iOS12 and below. https://apps.apple.com/nz/app/campermate-australia-nz/id1586561660
Minimum OS target is 9.0. We could drop support for iOS 9-11 but we still have plenty of iPhone 6 and 5 users (who are limited to iOS 12).
How can I fix this?
2021-12-15 10:51:09.526554+1300 TTG_Explore_Australia[36783:2248622] libMobileGestalt MobileGestalt.c:890: MGIsDeviceOneOfType is not supported on this platform.
2021-12-15 10:51:09.954515+1300 TTG_Explore_Australia[36783:2248622] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named UITabBarAppearance because no class named UITabBarAppearance was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)'
*** First throw call stack:
(
0 CoreFoundation 0x0000000113cae8db __exceptionPreprocess + 331
1 libobjc.A.dylib 0x0000000113259ac5 objc_exception_throw + 48
2 CoreFoundation 0x0000000113cae735 +[NSException raise:format:] + 197
3 UIFoundation 0x00000001176626c9 UINibDecoderDecodeObjectForValue + 360
4 UIFoundation 0x0000000117662af9 UINibDecoderDecodeObjectForValue + 1432
5 UIFoundation 0x0000000117662554 -[UINibDecoder decodeObjectForKey:] + 251
6 UIKitCore 0x000000011ca0c827 -[UINib instantiateWithOwner:options:] + 1306
7 UIKitCore 0x000000011cf28594 -[UIStoryboard instantiateViewControllerWithIdentifier:] + 181
8 UIKitCore 0x000000011cd8c809 -[UIApplication _loadMainStoryboardFileNamed:bundle:] + 111
9 UIKitCore 0x000000011cd8ccb1 -[UIApplication _loadMainInterfaceFile] + 274
10 UIKitCore 0x000000011cd8b3e5 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1360
11 UIKitCore 0x000000011c5cfa4e __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 904
12 UIKitCore 0x000000011c5d8346 +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153
13 UIKitCore 0x000000011c5cf664 -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 236
14 UIKitCore 0x000000011c5cffc0 -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 1091
15 UIKitCore 0x000000011c5ce332 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 782
16 UIKitCore 0x000000011c5cdfe9 -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 433
17 UIKitCore 0x000000011c5d2d2e __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 576
18 UIKitCore 0x000000011c5d3988 _performActionsWithDelayForTransitionContext + 100
19 UIKitCore 0x000000011c5d2a95 -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 223
20 UIKitCore 0x000000011c5d7a48 -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392
21 UIKitCore 0x000000011cd89dc8 -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 514
22 UIKitCore 0x000000011c94102f -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 361
23 FrontBoardServices 0x000000011aeb4d25 -[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 448
24 FrontBoardServices 0x000000011aebead6 __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 283
25 FrontBoardServices 0x000000011aebe300 __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 53
26 libdispatch.dylib 0x0000000114cc4db5 _dispatch_client_callout + 8
27 libdispatch.dylib 0x0000000114cc82ba _dispatch_block_invoke_direct + 300
28 FrontBoardServices 0x000000011aef00da __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 30
29 FrontBoardServices 0x000000011aeefd92 -[FBSSerialQueue _performNext] + 451
30 FrontBoardServices 0x000000011aef0327 -[FBSSerialQueue _performNextFromRunLoopSource] + 42
31 CoreFoundation 0x0000000113c15db1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
32 CoreFoundation 0x0000000113c15633 __CFRunLoopDoSources0 + 243
33 CoreFoundation 0x0000000113c0fcef __CFRunLoopRun + 1231
34 CoreFoundation 0x0000000113c0f4d2 CFRunLoopRunSpecific + 626
35 GraphicsServices 0x00000001169e62fe GSEventRunModal + 65
36 UIKitCore 0x000000011cd8cfc2 UIApplicationMain + 140
37 TTG_Explore_Australia 0x0000000100e63dd8 main + 104
38 ??? 0x0000000202b024fe 0x0 + 8635032830
39 ??? 0x0000000000000003 0x0 + 3
)
libc++abi.dylib: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named UITabBarAppearance because no class named UITabBarAppearance was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)'
terminating with uncaught exception of type NSException
CoreSimulator 776.4 - Device: iPhone 8 Plus (B0A6FB7E-392D-40E7-AC7C-B6AF109ABE60) - Runtime: iOS 12.4 (16G73) - DeviceType: iPhone 8 Plus
3
Answers
XCode had sneakily inserted these into my storyboard file without my knowledge!
and
Deleting these fixed it! I set appearance for iOS13+ in my code within a version check.
At the bottom of the stack trace it says:
UITabBarAppearance
was introduced in iOS 13, so it won’t work with older iOS versions. Check your code for any occurrences ofUITabBarAppearance
and either remove them or wrap in anif #available
. It could also be a problem with the storyboard usingUITabBarAppearance
internally.I resolved this by manually adding LinkPresentation.framework to "Link Binary with Libraries" in build phase, and setting its status to Optional.