Mastering the
Project File
@micheletitolo
Thursday, June 5, 14
Thursday, June 5, 14
Thursday, June 5, 14
Thursday, June 5, 14
Thursday, June 5, 14
<<<<<<< HEAD
! ! ! ! A487DC9215FE5DCD0037E8A3 /* AppDelegate.h */,
! ! ! ! A487DC9315FE5DCD0037E8A3 /* AppDelegate.m */,
! ! ! ! D9CA01C11720AD7D00CBD2B2 /* View Controllers */,
=======
! ! ! ! D9CA01B71720AC3000CBD2B2 /* Base */,
! ! ! ! D9CA01BB1720AC3C00CBD2B2 /* Controllers */,
>>>>>>> new_ratings
Thursday, June 5, 14
Falling back to patching base and 3-way merge...
Auto-merging MyApp.xcodeproj/project.pbxproj
CONFLICT (content): Merge conflict in
! MyApp.xcodeproj/project.pbxproj
Failed to merge in the changes.
Patch failed at 0037 Launch screen images update
The copy of the patch that failed is found in:
! /tmp/git/.git/rebase-apply/patch
Thursday, June 5, 14
It’s not that special
Thursday, June 5, 14
Thursday, June 5, 14
.xcodeproj
Thursday, June 5, 14
It’s a folder
Thursday, June 5, 14
Thursday, June 5, 14
Two kinds of files
Thursday, June 5, 14
Plist and XML
Thursday, June 5, 14
All the settings
Thursday, June 5, 14
Schemes, too
Thursday, June 5, 14
Thursday, June 5, 14
project.xcworkspace
Thursday, June 5, 14
another “special” folder
Thursday, June 5, 14
Thursday, June 5, 14
contents.xcworkspacedata
Thursday, June 5, 14
references .xcodeproj
Thursday, June 5, 14
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:MyApp.xcodeproj">
</FileRef>
</Workspace>
Thursday, June 5, 14
Not just in .xcodeproj
Thursday, June 5, 14
project.pbxproj
Thursday, June 5, 14
it’s a plist
Thursday, June 5, 14
a very special plist
Thursday, June 5, 14
the heart of your project
Thursday, June 5, 14
let’s look inside
Thursday, June 5, 14
// !$*UTF8*$!
{
! archiveVersion = 1;
! classes = {
! };
! objectVersion = 46;
! objects = {
/* Begin PBXBuildFile section */
! ! 8A9D5590A3E24AC297598750 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef...
! ! D94D3E72170B80FB00EA401C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; f...
! ! D94D3E74170B80FB00EA401C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFi...
! ! D94D3E76170B80FB00EA401C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuild...
! ! D94D3E7C170B80FB00EA401C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; ...
! ! D94D3E7E170B80FB00EA401C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D94...
! ! D94D3E82170B80FB00EA401C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRe...
! ! D94D3E84170B80FB00EA401C /* Default.png in Resources */ = {isa = PBXBuildFile; fileRe...
! ! D94D3E86170B80FB00EA401C /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fil...
! ! D94D3E88170B80FB00EA401C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile...
Thursday, June 5, 14
Thursday, June 5, 14
Let’s break it down
Thursday, June 5, 14
‘objects’ and ‘root_object’
Thursday, June 5, 14
‘objects’
Thursday, June 5, 14
objects = {
D94D3E72170B80FB00EA401C = {...};
D94D3E74170B80FB00EA401C = {...};
D94D3E76170B80FB00EA401C = {...};
532ABB3011D5647300D29D20 = {...};
532ABB3111D5647300D29D20 = {...};
532ABB3211D5647300D29D20 = {...};
532ABB3311D5647300D29D20 = {...};
};
Thursday, June 5, 14
Every object has a UID
Thursday, June 5, 14
objects = {
532ABB3011D5647300D29D20 = {...};
532ABB3111D5647300D29D20 = {...};
532ABB3211D5647300D29D20 = {...};
532ABB3311D5647300D29D20 = {...};
};
0
1
2
3
Thursday, June 5, 14
‘root_object’
Thursday, June 5, 14
04A4CCDA164D5E0400FB5950 /* Project object */ = {
! isa = PBXProject;
! attributes = {
! ! CLASSPREFIX = MRT;
! ! LastUpgradeCheck = 0450;
! ! ORGANIZATIONNAME = "Michele Titolo";
! };
! buildConfigurationList = 04A4CCDD164D5E0400FB5950;
! compatibilityVersion = "Xcode 3.2";
! developmentRegion = English;
! hasScannedForEncodings = 0;
! knownRegions = (
! ! en,
! );
! mainGroup = 04A4CCD8164D5E0400FB5950;
! productRefGroup = 04A4CCE4164D5E0400FB5950 /* Products */;
! projectDirPath = "";
! projectRoot = "";
! targets = (
! ! 04A4CCE2164D5E0400FB5950 /* MyApp */,
! ! D9D2509C173AB9AD0046F074 /* MyApp Test */,
! ! D9E6BA6A177CDB9C00C98B08 /* MyApp KIF */,
! );
};
Thursday, June 5, 14
04A4CCDA164D5E0400FB5950 /* Project object */ = {
! isa = PBXProject;
! attributes = {
! ! CLASSPREFIX = MRT;
! ! LastUpgradeCheck = 0450;
! ! ORGANIZATIONNAME = "Michele Titolo";
! };
! buildConfigurationList = 04A4CCDD164D5E0400FB5950;
! compatibilityVersion = "Xcode 3.2";
! developmentRegion = English;
! hasScannedForEncodings = 0;
! knownRegions = (
! ! en,
! );
! mainGroup = 04A4CCD8164D5E0400FB5950;
! productRefGroup = 04A4CCE4164D5E0400FB5950 /* Products */;
! projectDirPath = "";
! projectRoot = "";
! targets = (
! ! 04A4CCE2164D5E0400FB5950 /* MyApp */,
! ! D9D2509C173AB9AD0046F074 /* MyApp Test */,
! ! D9E6BA6A177CDB9C00C98B08 /* MyApp KIF */,
! );
};
isa
mainGroup
targets
buildConfigurationList
Thursday, June 5, 14
isa = PBXProject;
Thursday, June 5, 14
mainGroup = A487DC7415FE5DCD0037E8A3;
Thursday, June 5, 14
targets = (
! 1D6058900D05DD3D006BFB54 /* MyApp */,
! D94C698916E6E808002BDD31 /* MyApp Test */,
! D9E1D32A16E6FCC100C0524D /* MyApp Pro */,
);
Thursday, June 5, 14
projectReferences = (
! {
! ! ProductGroup = D94C698116E6E7DE002BDD31 /* Products */;
! ! ProjectRef = D94C698016E6E7DE002BDD31 /* KIF.xcodeproj */;
! },
);
Thursday, June 5, 14
buildConfigurationList = C01FCF4E08A954540054247B
Thursday, June 5, 14
Classes
Thursday, June 5, 14
PBXAggregateTarget
PBXBuildRule
PBXContainerItemProxy
PBXCopyFilesBuildPhase
PBXFileReference
PBXFrameworksBuildPhase
PBXGroup
PBXHeadersBuildPhase
PBXLegacyTarget
PBXNativeTarget
PBXProject
PBXReferenceProxy
PBXResourcesBuildPhase
PBXShellScriptBuildPhase
PBXSourcesBuildPhase
PBXTargetDependency
PBXVariantGroup
XCBuildConfiguration
XCConfigurationList
XCVersionGroup
Thursday, June 5, 14
Thursday, June 5, 14
Thursday, June 5, 14
XCBuildConfiguration
Thursday, June 5, 14
Thursday, June 5, 14
Debug and Release
Thursday, June 5, 14
Compiler flags
Thursday, June 5, 14
04A4CD07164D5E0400FB5950 /* Debug */ = {
! isa = XCBuildConfiguration;
! baseConfigurationReference = 4B98CBDFD81F4259923E97CE;
! buildSettings = {
! ! CODE_SIGN_IDENTITY = "iPhone Developer";
! ! "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
! ! GCC_PRECOMPILE_PREFIX_HEADER = YES;
! ! GCC_PREFIX_HEADER = "MyApp/MyApp-Prefix.pch";
! ! GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
! ! INFOPLIST_FILE = "MyApp/MyApp-Info.plist";
! ! PRODUCT_NAME = "$(TARGET_NAME)";
! ! PROVISIONING_PROFILE = "";
! ! "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
! ! WRAPPER_EXTENSION = app;
! };
! name = Debug;
};
PROVISIONING_PROFILE
PRODUCT_NAME
INFOPLIST_FILE
GCC_VERSION
CODE_SIGN_IDENTITY
name
Thursday, June 5, 14
Swift
Thursday, June 5, 14
SWIFT_OBJC_BRIDGING_HEADER = "MyApp-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
Thursday, June 5, 14
Project or Target
Thursday, June 5, 14
PBXNativeTarget
Thursday, June 5, 14
04A4CCE2164D5E0400FB5950 /* MyApp */ = {
! isa = PBXNativeTarget;
! buildConfigurationList = 04A4CD06164D5E0400FB5950 /* Build
configuration list for PBXNativeTarget "MyApp" */;
! buildPhases = (
! ! 29390B06A9D3479F9566AA27 /* Check Pods Manifest.lock */,
! ! 04A4CCDF164D5E0400FB5950 /* Sources */,
! ! 04A4CCE0164D5E0400FB5950 /* Frameworks */,
! ! 04A4CCE1164D5E0400FB5950 /* Resources */,
! ! F3BAB5EA93C24AE18A4EE832 /* Copy Pods Resources */,
! );
! buildRules = ();
! dependencies = ();
! name = MyApp;
! productName = MyApp;
! productReference = 04A4CCE3164D5E0400FB5950 /* MyApp.app */;
! productType = "com.apple.product-type.application";
};
buildPhases
name
buildConfigurationList
productName
Thursday, June 5, 14
Build phase types
Thursday, June 5, 14
PBXResourcesBuildPhase
==
Copy Bundle Resources
Thursday, June 5, 14
PBXSourcesBuildPhase
==
Compile Sources
Thursday, June 5, 14
PBXFrameworksBuildPhase
==
Link Binary With Libraries
Thursday, June 5, 14
PBXShellScriptBuildPhase
==
Run Script
Thursday, June 5, 14
F3BAB5EA93C24AE18A4EE832 /* Copy Pods Resources */ = {
! isa = PBXShellScriptBuildPhase;
! buildActionMask = 2147483647;
! files = ();
! inputPaths = ();
! name = "Copy Pods Resources";
! outputPaths = ();
! runOnlyForDeploymentPostprocessing = 0;
! shellPath = /bin/sh;
! shellScript = ""${SRCROOT}/Pods/Pods-resources.sh"n";
};
shellScript
Thursday, June 5, 14
xcuserdata
Thursday, June 5, 14
User-specific info
Thursday, June 5, 14
.xcuserdatad
Thursday, June 5, 14
Schemes & breakpoints
Thursday, June 5, 14
xcschememanagement.plist
Thursday, June 5, 14
MyApp.xcscheme
Thursday, June 5, 14
<?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>SchemeUserState</key>
! <dict>
! ! <key>MyApp.xcscheme_^#shared#^_</key>
! ! <dict>
! ! ! <key>orderHint</key>
! ! ! <integer>1</integer>
! ! </dict>
! </dict>
! <key>SuppressBuildableAutocreation</key>
! <dict>
! ! <key>1D6058900D05DD3D006BFB54</key>
! ! <dict>
! ! ! <key>primary</key>
! ! ! <true/>
! ! </dict>
! </dict>
</dict>
</plist>
MyApp.xcscheme_^#shared#^_
Thursday, June 5, 14
Thursday, June 5, 14
.gitignore’d
Thursday, June 5, 14
xcshareddata
Thursday, June 5, 14
.xcschemes
Thursday, June 5, 14
xml
Thursday, June 5, 14
Don’t .gitignore
Thursday, June 5, 14
The Big Picture
Thursday, June 5, 14
Thursday, June 5, 14
.pbxproj: It’s just a plist
Thursday, June 5, 14
.xcworkspace: It’s XML
Thursday, June 5, 14
xcshareddata: Has plists
Thursday, June 5, 14
xcuserdata: Has plists
Thursday, June 5, 14
Thursday, June 5, 14
git
Thursday, June 5, 14
Merge Conflicts
Thursday, June 5, 14
project.pbxproj
Thursday, June 5, 14
1. Check the comments
Thursday, June 5, 14
2. Pick 1 UID
Thursday, June 5, 14
3. Rebase early and often
Thursday, June 5, 14

Mastering the Project File (AltConf)