2
votes

I have 2 API keys that are currently used in my code, and are also hardcoded inside the code. These keys need to be removed from the code completely and added in as environment variables instead from outside Xcode during the build phase. So far I have tried having this script

export API_KEY=keyvalue

as a Run Script that occurs before Compile Sources in the build phase, having that script as a Pre Action in the project's scheme, and also building the app from the command line with this but the environment variables for the given keys are always null.

xcodebuild -project MyProject.xcodeproj \
-scheme "My Scheme" \
-sdk iphoneos \
-destination 'platform=iOS,name=<devicename>' \
-derivedDataPath './output' \
API_KEY='KEY' \
SECOND_API_KEY='KEY' \

When manually building the project like this I can see the keys being exported correctly like all the other settings but cannot seem to access them with NSProcessInfo.processInfo.environment objectForKey:@"API_KEY" or with NSUserDefaults. I have also tried editing the scheme in Xcode so that the environment variables are set as API_KEY = $(API_KEY) along with the above but that did not work, as well as setting default values for these keys in Build Settings which also did not work. Is this actually possible to do? Thanks.

1
Do you want these environment variables to be set when your app runs? Or are you trying to capture their values when building to prevent checking them in to source control? I'm confused by your desire to access build-time environment variables using NSProcessInfo. - sbooth
The variables just need to be set when the app is built so that whenever it is run they are accessible from NSProcessInfo.processInfo.environment. Generally you would set environment variables in Xcode with Edit Scheme > Run >Environment Variables but then the API keys would be in the code still, so they need to be set manually with a script outside the app when the app is built. Something similar to this, except this was for testing: stackoverflow.com/questions/23284829/… - Versicarius

1 Answers

1
votes

If I'm understanding you correctly you are misunderstanding environment variables, if I'm not my apologies.

You cannot access environment variables that were set during the build process when your application runs – unless that build process writes the values into the code or some configuration file.

Environment variables are passed to a process when it is started, your code can access those variables. While the names of the environment variables will need to be embedded in your code the values of those variables is not.

It sounds like you wish to distribute a compiled app without the API keys it needs to run and then supply those when it is run. You could do this by using a small shell script to set environment variables and then launch your app. Or you could use a scheme like those used for serial numbers, so your users have to enter the API keys (just tell them they are serial numbers ;-)) when your app is first launched and then store those in a suitable file (e.g. in your app's preferences or application support folder) obfuscated in whatever way you choose. HTH