ios: generate the helper's Info.plist from its extension point binding

The helper's hand-written Info.plist declared its extension point the way
an App Store upload was rejected for in Apple forums thread 803896 (ITMS-90349,
invalid EXExtensionPointIdentifier); Apple's fix was the documented helper
extension setup, which binds in code and lets Xcode generate the Info.plist
instead. Build settings in the binding are expanded, so UTM and UTM SE
still bind to their own host with any bundle prefix.

Assisted-by: Claude:claude-opus-5-5
This commit is contained in:
osy
2026-09-24 01:56:57 -05:00
parent 226d552976
commit 15dee7b3f5
3 changed files with 10 additions and 17 deletions
+4 -6
View File
@@ -1911,7 +1911,6 @@
84A0A8822A47D52E0038F329 /* UTMQemuPort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UTMQemuPort.swift; sourceTree = "<group>"; };
84A381A9268CB30C0048EE4D /* VMDrivesSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VMDrivesSettingsView.swift; sourceTree = "<group>"; };
84A57CB130641C6800BA5139 /* iOSHelper.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.extensionkit-extension"; includeInIndex = 0; path = iOSHelper.appex; sourceTree = BUILT_PRODUCTS_DIR; };
84A57CBE30641C9100BA5139 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
84A57CBF30641C9100BA5139 /* iOSHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSHelper.swift; sourceTree = "<group>"; };
84A57D0930641D0000BA5139 /* iOSHelper-SE.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.extensionkit-extension"; includeInIndex = 0; path = "iOSHelper-SE.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
84A57D0C30641D0000BA5139 /* UTMHelperProcess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UTMHelperProcess.swift; sourceTree = "<group>"; };
@@ -2729,7 +2728,6 @@
84A57CC030641C9100BA5139 /* iOSHelper */ = {
isa = PBXGroup;
children = (
84A57CBE30641C9100BA5139 /* Info.plist */,
84A57CBF30641C9100BA5139 /* iOSHelper.swift */,
84A57D0F30641D0000BA5139 /* iOSHelper-Bridging-Header.h */,
);
@@ -5052,9 +5050,9 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CODE_SIGN_IDENTITY = "$(CODE_SIGN_IDENTITY_IOS:default=Apple Development)";
CODE_SIGN_STYLE = "$(CODE_SIGN_STYLE_IOS:default=)";
EX_ENABLE_EXTENSION_POINT_GENERATION = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = iOSHelper/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = iOSHelper;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2026 Turing Software, LLC. All rights reserved.";
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
@@ -5091,9 +5089,9 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CODE_SIGN_IDENTITY = "$(CODE_SIGN_IDENTITY_IOS:default=Apple Development)";
CODE_SIGN_STYLE = "$(CODE_SIGN_STYLE_IOS:default=)";
EX_ENABLE_EXTENSION_POINT_GENERATION = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = iOSHelper/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = iOSHelper;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2026 Turing Software, LLC. All rights reserved.";
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
@@ -5128,9 +5126,9 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CODE_SIGN_IDENTITY = "$(CODE_SIGN_IDENTITY_IOS:default=Apple Development)";
CODE_SIGN_STYLE = "$(CODE_SIGN_STYLE_IOS:default=)";
EX_ENABLE_EXTENSION_POINT_GENERATION = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = iOSHelper/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = iOSHelper;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2026 Turing Software, LLC. All rights reserved.";
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
@@ -5167,9 +5165,9 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CODE_SIGN_IDENTITY = "$(CODE_SIGN_IDENTITY_IOS:default=Apple Development)";
CODE_SIGN_STYLE = "$(CODE_SIGN_STYLE_IOS:default=)";
EX_ENABLE_EXTENSION_POINT_GENERATION = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = iOSHelper/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = iOSHelper;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2026 Turing Software, LLC. All rights reserved.";
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
-11
View File
@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EXAppExtensionAttributes</key>
<dict>
<key>EXExtensionPointIdentifier</key>
<string>$(UTM_HOST_BUNDLE_IDENTIFIER).qemu-helper</string>
</dict>
</dict>
</plist>
+6
View File
@@ -28,6 +28,12 @@ final class iOSHelper: AppExtension {
required init() {
}
/// Xcode writes this into the generated Info.plist, expanding the build setting for UTM or UTM SE
@AppExtensionPoint.Bind
var boundExtensionPoint: AppExtensionPoint {
AppExtensionPoint.Identifier(host: "$(UTM_HOST_BUNDLE_IDENTIFIER)", name: "qemu-helper")
}
var configuration: some AppExtensionConfiguration {
ConnectionHandler { connection in
connection.exportedInterface = NSXPCInterface(with: QEMUHelperProtocol.self)