Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find the Xcode Build scheme name at run time

Tags:

xcode

ios

Is there a way to find out the Scheme used at the run time ?

May be there is a better way to do this, I'm trying to set the Access Environment (Production vs Development) by using the Scheme name.

Currently I use #define ENV @"PROD" in App-Prefix.pch file to do this, but there is a chance to miss this when sending pkg to apple for review :(

like image 328
user390687 Avatar asked Apr 06 '13 23:04

user390687


People also ask

How do I know what scheme my Xcode project is?

In Xcode Go to Products>Scheme>Manage Scheme and check share to share. Set absolute path everywhere. here you need to change /path/to/your/project/ with your path and testDemo with your project name.

How do I find my Xcode build settings?

Choose the project in the Project Navigator on the left. Select the Configurations target from the Targets section and click the Build Settings tab at the top. The Build Settings tab shows the build settings for the Configurations target. It's possible to expand this list with build settings that you define.

What is scheme name in Xcode?

An Xcode scheme defines a collection of targets to build, a configuration to use when building, and a collection of tests to execute. You can have as many schemes as you want, but only one can be active at a time.

Where are schemes stored Xcode?

Schemes are saved in a separate xml file, within xcuserdata or xcshareddata . Most repositories ignore xcuserdata since Xcode also put things in there like breakpoint settings that shouldn't be shared between developers.


2 Answers

I searched far and wide for an answer to this because I really don't like the idea of creating extra Targets nor extra Configuration sets. Both of those options just create a huge Configuration synchronization problem.

So, after hacking Xcode for a couple of hours, this is what I came up with:

Step 1: Add the key "SchemeName" to your Info.plist with type string.

Step 2: Edit your default scheme and on Build -> Pre-actions add a new Run Script with the following:

/usr/libexec/PlistBuddy -c "Set :SchemeName \"$SCHEME_NAME\"" "$PROJECT_DIR/$INFOPLIST_FILE"

Make sure and select a target from under "Provide build settings from".

Step 3: Now duplicate that scheme as many times as you like (Manage Schemes... -> Select existing scheme -> Click gear icon -> Duplicate) For instance, you can create Development, Staging, Production, App Store, etc. Don't forget to click "shared" if you want these schemes carried around in version control.

Step 4: In the code, you can retrieve the value like this:

NSString *schemeName = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"SchemeName"];

Or in Swift:

let schemeName = Bundle.main.infoDictionary?["SchemeName"] as? String ?? ""

Now, the code can configure itself correctly at runtime. No nasty preprocessor macros to deal with and no brittle configuration mess to maintain.

UPDATE: According to the comments below, $PROJECT_DIR might need to be removed depending on where your Info.plist is located in your project.

like image 94
David K. Hess Avatar answered Sep 30 '22 09:09

David K. Hess


When running an app on the simulator or on your device, the DEBUG variable is set, allowing you to use it from your code:

#ifdef DEBUG
    // Something
#else
    // Something else
#endif

You can see this variable from your target's build settings:

As soon as the Run configuration is set on Debug (Product -> Scheme -> Edit Scheme), this variable will be set:

enter image description here

like image 22
ldiqual Avatar answered Sep 30 '22 09:09

ldiqual