ARTICLE AD BOX
I'm creating an iOS app that's simply a collection of actions for the Shortcuts app (like Sindre Sorhus' one).
When validating or distributing a built archive / release, it fails with the following errors:
Validation failed
Missing Info.plist values. No values for NSExtensionMainStoryboard or NSExtensionPrincipalClass found in extension Info.plist for iOS App.app/PlugIns/iOS App Intents.appex. (ID: c4b0b508-eb81-4570-92c8-448c1c2624ca)
Validation failed
Missing Info.plist values. No values for NSExtensionMainStoryboard or NSExtensionPrincipalClass found in extension Info.plist for iOS App.app/Watch/watchOS App.app/PlugIns/watchOS App Intents.appex. (ID: 04cb75a2-f3eb-4a5d-b338-df05858fdc13)
In each "Info.plist", creating KV "NSExtensionPrincipalClass": "$(PRODUCT_MODULE_NAME).ShortcutsAppIntentsExtension" did resolve the validation / submission errors.
However, its presence causes installations (Debug and Release) to fail with the following errors:
Failed to install the app on the device. Domain: com.apple.dt.CoreDeviceError Code: 3002 User Info: { DVTErrorCreationDateKey = "2026-04-03 12:37:35 +0000"; IDERunOperationFailingWorker = IDEInstallCoreDeviceWorker; NSURL = "file:///Users/ben/Library/Developer/Xcode/DerivedData/shortcuts-dndxewxojvxhezevubvqulsskvso/Build/Products/Release-iphoneos/iOS%20App.app"; } -- Unable to Install “<app name>” Domain: IXUserPresentableErrorDomain Code: 1 Failure Reason: Please try again later. Recovery Suggestion: Appex bundle at /var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.3EZRvF/extracted/iOS App.app/PlugIns/iOS App Intents.appex with id com.mythofechelon.shortcuts.appintents defines either an NSExtensionMainStoryboard or NSExtensionPrincipalClass key, which is not allowed for the extension point com.apple.appintents-extension -- Appex bundle at /var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.3EZRvF/extracted/iOS App.app/PlugIns/iOS App Intents.appex with id com.mythofechelon.shortcuts.appintents defines either an NSExtensionMainStoryboard or NSExtensionPrincipalClass key, which is not allowed for the extension point com.apple.appintents-extension Domain: MIInstallerErrorDomain Code: 152 User Info: { FunctionName = "-[MIPluginKitBundle _validateNSExtensionWithOverlaidDictionary:error:]"; LegacyErrorString = AppexBundleContainsClassOrStoryboard; SourceFileLine = 350; } -- Event Metadata: com.apple.dt.IDERunOperationWorkerFinished : { "device_identifier" = "00008150-000975991E08401C"; "device_isCoreDevice" = 1; "device_model" = "iPhone18,1"; "device_osBuild" = "26.4 (23E246)"; "device_osBuild_monotonic" = 2304024600; "device_os_variant" = 1; "device_platform" = "com.apple.platform.iphoneos"; "device_platform_family" = 2; "device_reality" = 1; "device_thinningType" = "iPhone18,1"; "device_transport" = 0; "launchSession_schemeCommand" = Run; "launchSession_schemeCommand_enum" = 1; "launchSession_targetArch" = arm64; "launchSession_targetArch_enum" = 6; "operation_duration_ms" = 3374; "operation_errorCode" = 152; "operation_errorDomain" = "com.apple.dt.CoreDeviceError.3002.IXUserPresentableErrorDomain.1.MIInstallerErrorDomain"; "operation_errorWorker" = IDEInstallCoreDeviceWorker; "operation_error_reportable" = 1; "operation_name" = IDERunOperationWorkerGroup; "param_consoleMode" = 1; "param_debugger_attachToExtensions" = 0; "param_debugger_attachToXPC" = 1; "param_debugger_type" = 3; "param_destination_isProxy" = 0; "param_destination_platform" = "com.apple.platform.iphoneos"; "param_diag_MTE_enable" = 0; "param_diag_MainThreadChecker_stopOnIssue" = 0; "param_diag_MallocStackLogging_enableDuringAttach" = 0; "param_diag_MallocStackLogging_enableForXPC" = 1; "param_diag_allowLocationSimulation" = 1; "param_diag_checker_mtc_enable" = 1; "param_diag_checker_tpc_enable" = 1; "param_diag_gpu_frameCapture_enable" = 0; "param_diag_gpu_shaderValidation_enable" = 0; "param_diag_gpu_validation_enable" = 0; "param_diag_guardMalloc_enable" = 0; "param_diag_memoryGraphOnResourceException" = 0; "param_diag_queueDebugging_enable" = 1; "param_diag_runtimeProfile_generate" = 0; "param_diag_sanitizer_asan_enable" = 0; "param_diag_sanitizer_tsan_enable" = 0; "param_diag_sanitizer_tsan_stopOnIssue" = 0; "param_diag_sanitizer_ubsan_enable" = 0; "param_diag_sanitizer_ubsan_stopOnIssue" = 0; "param_diag_showNonLocalizedStrings" = 0; "param_diag_viewDebugging_enabled" = 1; "param_diag_viewDebugging_insertDylibOnLaunch" = 1; "param_install_style" = 2; "param_launcher_UID" = 2; "param_launcher_allowDeviceSensorReplayData" = 0; "param_launcher_kind" = 0; "param_launcher_style" = 99; "param_launcher_substyle" = 0; "param_lldbVersion_component_idx_1" = 0; "param_lldbVersion_monotonic" = 170302360103; "param_runnable_appExtensionHostRunMode" = 0; "param_runnable_productType" = "com.apple.product-type.application"; "param_testing_launchedForTesting" = 0; "param_testing_suppressSimulatorApp" = 0; "param_testing_usingCLI" = 0; "sdk_canonicalName" = "iphoneos26.2"; "sdk_osVersion" = "26.2"; "sdk_platformID" = 2; "sdk_variant" = iphoneos; "sdk_version_monotonic" = 2302005700; } -- System Information macOS Version 26.1 (Build 25B78) Xcode 26.3 (24587) (Build 17C529) Timestamp: 2026-04-03T13:37:35+01:00This seems like a catch-22 situation, but I'm hoping someone has a suggestion.
