Home > Software design >  App crashes on iOS 12 and below after building with Xcode 13
App crashes on iOS 12 and below after building with Xcode 13

Time:12-15

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

CodePudding user response:

At the bottom of the stack trace it says:

*** 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

UITabBarAppearance was introduced in iOS 13, so it won't work with older iOS versions. Check your code for any occurrences of UITabBarAppearance and either remove them or wrap in an if #available. It could also be a problem with the storyboard using UITabBarAppearance internally.

CodePudding user response:

XCode had sneakily inserted these into my storyboard file without my knowledge!

<tabBarAppearance key="standardAppearance"/>

and

<navigationBarAppearance key="standardAppearance"/>

Deleting these fixed it! I set appearance for iOS13 in my code within a version check.

  • Related