Single code base with different build configurations
Don't make more versions of your source code. Rather than add more code bases, fix the underlying design problem that is preventing you from running from a single code base. From Extreme Programming Explained
For a app developer, usually we had to modify our app for specific targets and markets, different login paths, alternative functions, various layouts, etc.
It's ok to have a helper function to check locales for us, but what if we had to separate our source code into two apps, just like Evernote and 印象筆記 (Evernote for China market).
Different bundle ids, backend servers, might even icons!
Build configurations
Create a new Build Configuration
set:
Preprocessor Macros
In project's build settings
, find preprocessor marcros column, you can define different values for each of your configurations. You can define KEY=VALUE
or just KEY
macros here.
In your code, you can implement preprocessor marcos like this:
#ifdef foo
// somethings
#else
// some other things
#endif
User-Defined Settings
Go to your project's build settings
, select Editor
-> Add Build Setting
-> Add User-Defined Settings.
You will get a User Defined
field. For my usage, I create two values named APP_NAME
and BUNDLE_ID
.
In my -info.plist
, I changed my Bundle display name
and Bundle identifier
value to ${APP_NAME}
and ${BUNDLE_ID}
.
App icons
I use Asset Catalog handling my image resources, insideImages.xcassets
create a new App icon
set.
Back to your target build settings
, you can find Asset Catalog App Icon Set Name
field, specify which App icon set shuld be used for configurations.
That's it.
Builds
Xcode
From Scheme editor
, select which build configurations you want to apply.
Command lines
If you run Continuous integration for your project, you must build your project with xcodebuild or xctool, they both had -configuration
flag, specify your build configuration name to it.