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 :(
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.
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.
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.
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.
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.
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With