Skip to content

Commit 3ce074e

Browse files
EvanBaconclaude
andauthored
Add modern SwiftUI multiplatform project types and fixture (#48)
- Add PBXProject properties: preferredProjectObjectVersion, minimizedProjectReferenceProxies - Make PBXFileSystemSynchronizedRootGroup.explicitFileTypes/explicitFolders optional - Add new BuildSettings: XROS_DEPLOYMENT_TARGET, SWIFT_APPROACHABLE_CONCURRENCY, SWIFT_DEFAULT_ACTOR_ISOLATION, SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY, ENABLE_APP_SANDBOX, REGISTER_APP_GROUPS, ENABLE_USER_SELECTED_FILES, STRING_CATALOG_GENERATE_SYMBOLS - Add SDK-specific conditional build settings for multiplatform apps - Add gnu17 to GCC_C_LANGUAGE_STANDARD, 5.0 to SWIFT_VERSION - Add test fixture 010-swiftui-multiplatform.pbxproj (objectVersion 77) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1 parent cc36a99 commit 3ce074e

File tree

3 files changed

+402
-5
lines changed

3 files changed

+402
-5
lines changed
Lines changed: 356 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,356 @@
1+
// !$*UTF8*$!
2+
{
3+
archiveVersion = 1;
4+
classes = {
5+
};
6+
objectVersion = 77;
7+
objects = {
8+
9+
/* Begin PBXFileReference section */
10+
CDD61D6F2F5CA7F700987C34 /* demo-multiplatform.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-multiplatform.app"; sourceTree = BUILT_PRODUCTS_DIR; };
11+
/* End PBXFileReference section */
12+
13+
/* Begin PBXFileSystemSynchronizedRootGroup section */
14+
CDD61D712F5CA7F700987C34 /* demo-multiplatform */ = {
15+
isa = PBXFileSystemSynchronizedRootGroup;
16+
path = "demo-multiplatform";
17+
sourceTree = "<group>";
18+
};
19+
/* End PBXFileSystemSynchronizedRootGroup section */
20+
21+
/* Begin PBXFrameworksBuildPhase section */
22+
CDD61D6C2F5CA7F700987C34 /* Frameworks */ = {
23+
isa = PBXFrameworksBuildPhase;
24+
buildActionMask = 2147483647;
25+
files = (
26+
);
27+
runOnlyForDeploymentPostprocessing = 0;
28+
};
29+
/* End PBXFrameworksBuildPhase section */
30+
31+
/* Begin PBXGroup section */
32+
CDD61D662F5CA7F700987C34 = {
33+
isa = PBXGroup;
34+
children = (
35+
CDD61D712F5CA7F700987C34 /* demo-multiplatform */,
36+
CDD61D702F5CA7F700987C34 /* Products */,
37+
);
38+
sourceTree = "<group>";
39+
};
40+
CDD61D702F5CA7F700987C34 /* Products */ = {
41+
isa = PBXGroup;
42+
children = (
43+
CDD61D6F2F5CA7F700987C34 /* demo-multiplatform.app */,
44+
);
45+
name = Products;
46+
sourceTree = "<group>";
47+
};
48+
/* End PBXGroup section */
49+
50+
/* Begin PBXNativeTarget section */
51+
CDD61D6E2F5CA7F700987C34 /* demo-multiplatform */ = {
52+
isa = PBXNativeTarget;
53+
buildConfigurationList = CDD61D7A2F5CA7F800987C34 /* Build configuration list for PBXNativeTarget "demo-multiplatform" */;
54+
buildPhases = (
55+
CDD61D6B2F5CA7F700987C34 /* Sources */,
56+
CDD61D6C2F5CA7F700987C34 /* Frameworks */,
57+
CDD61D6D2F5CA7F700987C34 /* Resources */,
58+
);
59+
buildRules = (
60+
);
61+
dependencies = (
62+
);
63+
fileSystemSynchronizedGroups = (
64+
CDD61D712F5CA7F700987C34 /* demo-multiplatform */,
65+
);
66+
name = "demo-multiplatform";
67+
packageProductDependencies = (
68+
);
69+
productName = "demo-multiplatform";
70+
productReference = CDD61D6F2F5CA7F700987C34 /* demo-multiplatform.app */;
71+
productType = "com.apple.product-type.application";
72+
};
73+
/* End PBXNativeTarget section */
74+
75+
/* Begin PBXProject section */
76+
CDD61D672F5CA7F700987C34 /* Project object */ = {
77+
isa = PBXProject;
78+
attributes = {
79+
BuildIndependentTargetsInParallel = 1;
80+
LastSwiftUpdateCheck = 2630;
81+
LastUpgradeCheck = 2630;
82+
TargetAttributes = {
83+
CDD61D6E2F5CA7F700987C34 = {
84+
CreatedOnToolsVersion = 26.3;
85+
};
86+
};
87+
};
88+
buildConfigurationList = CDD61D6A2F5CA7F700987C34 /* Build configuration list for PBXProject "demo-multiplatform" */;
89+
developmentRegion = en;
90+
hasScannedForEncodings = 0;
91+
knownRegions = (
92+
en,
93+
Base,
94+
);
95+
mainGroup = CDD61D662F5CA7F700987C34;
96+
minimizedProjectReferenceProxies = 1;
97+
preferredProjectObjectVersion = 77;
98+
productRefGroup = CDD61D702F5CA7F700987C34 /* Products */;
99+
projectDirPath = "";
100+
projectRoot = "";
101+
targets = (
102+
CDD61D6E2F5CA7F700987C34 /* demo-multiplatform */,
103+
);
104+
};
105+
/* End PBXProject section */
106+
107+
/* Begin PBXResourcesBuildPhase section */
108+
CDD61D6D2F5CA7F700987C34 /* Resources */ = {
109+
isa = PBXResourcesBuildPhase;
110+
buildActionMask = 2147483647;
111+
files = (
112+
);
113+
runOnlyForDeploymentPostprocessing = 0;
114+
};
115+
/* End PBXResourcesBuildPhase section */
116+
117+
/* Begin PBXSourcesBuildPhase section */
118+
CDD61D6B2F5CA7F700987C34 /* Sources */ = {
119+
isa = PBXSourcesBuildPhase;
120+
buildActionMask = 2147483647;
121+
files = (
122+
);
123+
runOnlyForDeploymentPostprocessing = 0;
124+
};
125+
/* End PBXSourcesBuildPhase section */
126+
127+
/* Begin XCBuildConfiguration section */
128+
CDD61D782F5CA7F800987C34 /* Debug */ = {
129+
isa = XCBuildConfiguration;
130+
buildSettings = {
131+
ALWAYS_SEARCH_USER_PATHS = NO;
132+
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
133+
CLANG_ANALYZER_NONNULL = YES;
134+
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
135+
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
136+
CLANG_ENABLE_MODULES = YES;
137+
CLANG_ENABLE_OBJC_ARC = YES;
138+
CLANG_ENABLE_OBJC_WEAK = YES;
139+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
140+
CLANG_WARN_BOOL_CONVERSION = YES;
141+
CLANG_WARN_COMMA = YES;
142+
CLANG_WARN_CONSTANT_CONVERSION = YES;
143+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
144+
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
145+
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
146+
CLANG_WARN_EMPTY_BODY = YES;
147+
CLANG_WARN_ENUM_CONVERSION = YES;
148+
CLANG_WARN_INFINITE_RECURSION = YES;
149+
CLANG_WARN_INT_CONVERSION = YES;
150+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
151+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
152+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
153+
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
154+
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
155+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
156+
CLANG_WARN_STRICT_PROTOTYPES = YES;
157+
CLANG_WARN_SUSPICIOUS_MOVE = YES;
158+
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
159+
CLANG_WARN_UNREACHABLE_CODE = YES;
160+
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
161+
COPY_PHASE_STRIP = NO;
162+
DEBUG_INFORMATION_FORMAT = dwarf;
163+
DEVELOPMENT_TEAM = QQ57RJ5UTD;
164+
ENABLE_STRICT_OBJC_MSGSEND = YES;
165+
ENABLE_TESTABILITY = YES;
166+
ENABLE_USER_SCRIPT_SANDBOXING = YES;
167+
GCC_C_LANGUAGE_STANDARD = gnu17;
168+
GCC_DYNAMIC_NO_PIC = NO;
169+
GCC_NO_COMMON_BLOCKS = YES;
170+
GCC_OPTIMIZATION_LEVEL = 0;
171+
GCC_PREPROCESSOR_DEFINITIONS = (
172+
"DEBUG=1",
173+
"$(inherited)",
174+
);
175+
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
176+
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
177+
GCC_WARN_UNDECLARED_SELECTOR = YES;
178+
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
179+
GCC_WARN_UNUSED_FUNCTION = YES;
180+
GCC_WARN_UNUSED_VARIABLE = YES;
181+
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
182+
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
183+
MTL_FAST_MATH = YES;
184+
ONLY_ACTIVE_ARCH = YES;
185+
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
186+
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
187+
};
188+
name = Debug;
189+
};
190+
CDD61D792F5CA7F800987C34 /* Release */ = {
191+
isa = XCBuildConfiguration;
192+
buildSettings = {
193+
ALWAYS_SEARCH_USER_PATHS = NO;
194+
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
195+
CLANG_ANALYZER_NONNULL = YES;
196+
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
197+
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
198+
CLANG_ENABLE_MODULES = YES;
199+
CLANG_ENABLE_OBJC_ARC = YES;
200+
CLANG_ENABLE_OBJC_WEAK = YES;
201+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
202+
CLANG_WARN_BOOL_CONVERSION = YES;
203+
CLANG_WARN_COMMA = YES;
204+
CLANG_WARN_CONSTANT_CONVERSION = YES;
205+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
206+
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
207+
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
208+
CLANG_WARN_EMPTY_BODY = YES;
209+
CLANG_WARN_ENUM_CONVERSION = YES;
210+
CLANG_WARN_INFINITE_RECURSION = YES;
211+
CLANG_WARN_INT_CONVERSION = YES;
212+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
213+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
214+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
215+
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
216+
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
217+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
218+
CLANG_WARN_STRICT_PROTOTYPES = YES;
219+
CLANG_WARN_SUSPICIOUS_MOVE = YES;
220+
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
221+
CLANG_WARN_UNREACHABLE_CODE = YES;
222+
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
223+
COPY_PHASE_STRIP = NO;
224+
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
225+
DEVELOPMENT_TEAM = QQ57RJ5UTD;
226+
ENABLE_NS_ASSERTIONS = NO;
227+
ENABLE_STRICT_OBJC_MSGSEND = YES;
228+
ENABLE_USER_SCRIPT_SANDBOXING = YES;
229+
GCC_C_LANGUAGE_STANDARD = gnu17;
230+
GCC_NO_COMMON_BLOCKS = YES;
231+
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
232+
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
233+
GCC_WARN_UNDECLARED_SELECTOR = YES;
234+
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
235+
GCC_WARN_UNUSED_FUNCTION = YES;
236+
GCC_WARN_UNUSED_VARIABLE = YES;
237+
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
238+
MTL_ENABLE_DEBUG_INFO = NO;
239+
MTL_FAST_MATH = YES;
240+
SWIFT_COMPILATION_MODE = wholemodule;
241+
};
242+
name = Release;
243+
};
244+
CDD61D7B2F5CA7F800987C34 /* Debug */ = {
245+
isa = XCBuildConfiguration;
246+
buildSettings = {
247+
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
248+
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
249+
CODE_SIGN_STYLE = Automatic;
250+
CURRENT_PROJECT_VERSION = 1;
251+
DEVELOPMENT_TEAM = QQ57RJ5UTD;
252+
ENABLE_APP_SANDBOX = YES;
253+
ENABLE_HARDENED_RUNTIME = YES;
254+
ENABLE_PREVIEWS = YES;
255+
ENABLE_USER_SELECTED_FILES = readonly;
256+
GENERATE_INFOPLIST_FILE = YES;
257+
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
258+
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
259+
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
260+
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
261+
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
262+
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
263+
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
264+
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
265+
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
266+
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
267+
IPHONEOS_DEPLOYMENT_TARGET = 26.2;
268+
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
269+
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
270+
MACOSX_DEPLOYMENT_TARGET = 26.2;
271+
MARKETING_VERSION = 1.0;
272+
PRODUCT_BUNDLE_IDENTIFIER = "org.name.HelloWorld.demo-multiplatform";
273+
PRODUCT_NAME = "$(TARGET_NAME)";
274+
REGISTER_APP_GROUPS = YES;
275+
SDKROOT = auto;
276+
STRING_CATALOG_GENERATE_SYMBOLS = YES;
277+
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator";
278+
SWIFT_APPROACHABLE_CONCURRENCY = YES;
279+
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
280+
SWIFT_EMIT_LOC_STRINGS = YES;
281+
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
282+
SWIFT_VERSION = 5.0;
283+
TARGETED_DEVICE_FAMILY = "1,2,7";
284+
XROS_DEPLOYMENT_TARGET = 26.2;
285+
};
286+
name = Debug;
287+
};
288+
CDD61D7C2F5CA7F800987C34 /* Release */ = {
289+
isa = XCBuildConfiguration;
290+
buildSettings = {
291+
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
292+
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
293+
CODE_SIGN_STYLE = Automatic;
294+
CURRENT_PROJECT_VERSION = 1;
295+
DEVELOPMENT_TEAM = QQ57RJ5UTD;
296+
ENABLE_APP_SANDBOX = YES;
297+
ENABLE_HARDENED_RUNTIME = YES;
298+
ENABLE_PREVIEWS = YES;
299+
ENABLE_USER_SELECTED_FILES = readonly;
300+
GENERATE_INFOPLIST_FILE = YES;
301+
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
302+
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
303+
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
304+
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
305+
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
306+
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
307+
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
308+
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
309+
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
310+
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
311+
IPHONEOS_DEPLOYMENT_TARGET = 26.2;
312+
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
313+
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
314+
MACOSX_DEPLOYMENT_TARGET = 26.2;
315+
MARKETING_VERSION = 1.0;
316+
PRODUCT_BUNDLE_IDENTIFIER = "org.name.HelloWorld.demo-multiplatform";
317+
PRODUCT_NAME = "$(TARGET_NAME)";
318+
REGISTER_APP_GROUPS = YES;
319+
SDKROOT = auto;
320+
STRING_CATALOG_GENERATE_SYMBOLS = YES;
321+
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator";
322+
SWIFT_APPROACHABLE_CONCURRENCY = YES;
323+
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
324+
SWIFT_EMIT_LOC_STRINGS = YES;
325+
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
326+
SWIFT_VERSION = 5.0;
327+
TARGETED_DEVICE_FAMILY = "1,2,7";
328+
XROS_DEPLOYMENT_TARGET = 26.2;
329+
};
330+
name = Release;
331+
};
332+
/* End XCBuildConfiguration section */
333+
334+
/* Begin XCConfigurationList section */
335+
CDD61D6A2F5CA7F700987C34 /* Build configuration list for PBXProject "demo-multiplatform" */ = {
336+
isa = XCConfigurationList;
337+
buildConfigurations = (
338+
CDD61D782F5CA7F800987C34 /* Debug */,
339+
CDD61D792F5CA7F800987C34 /* Release */,
340+
);
341+
defaultConfigurationIsVisible = 0;
342+
defaultConfigurationName = Release;
343+
};
344+
CDD61D7A2F5CA7F800987C34 /* Build configuration list for PBXNativeTarget "demo-multiplatform" */ = {
345+
isa = XCConfigurationList;
346+
buildConfigurations = (
347+
CDD61D7B2F5CA7F800987C34 /* Debug */,
348+
CDD61D7C2F5CA7F800987C34 /* Release */,
349+
);
350+
defaultConfigurationIsVisible = 0;
351+
defaultConfigurationName = Release;
352+
};
353+
/* End XCConfigurationList section */
354+
};
355+
rootObject = CDD61D672F5CA7F700987C34 /* Project object */;
356+
}

src/json/__tests__/json.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ describe(parse, () => {
3333
"007-xcode16.pbxproj",
3434
"008-out-of-order-orphans.pbxproj",
3535
"009-expo-app-clip.pbxproj",
36+
"010-swiftui-multiplatform.pbxproj",
3637
"shopify-tophat.pbxproj",
3738
"AFNetworking.pbxproj",
3839
"project.pbxproj",
@@ -68,6 +69,7 @@ describe(parse, () => {
6869
const inOutFixtures = [
6970
"006-spm.pbxproj",
7071
"007-xcode16.pbxproj",
72+
"010-swiftui-multiplatform.pbxproj",
7173

7274
"AFNetworking.pbxproj",
7375
"project.pbxproj",

0 commit comments

Comments
 (0)