 <p>I think msmq's answer is valid, but you should be a little careful about using the main info.plist this way. Doing that suggests that all your versions of info.plist are almost identical, except for a couple of differences. That's a recipe for divergence, and then hard-to-debug issues when you want to add a new URI handler or background mode or any of the other things that might modify info.plist.</p> <p>Instead, I recommend you take the keys that vary out of the main info.plist. Create another plist (say "Config.plist") to store them. Add a Run Script build phase to copy the correct one over. See the <a href="https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html" rel="nofollow">Build Settings Reference</a> for a list of variables you can substitute. An example script might be:</p> <pre><code>cp ${SOURCE_ROOT}/Resources/Config-${CONFIGURATION}.plist ${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Config.plist </code></pre> <p>Then you can read the file using something like this (based on <a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/QuickStartPlist/QuickStartPlist.html#//apple_ref/doc/uid/10000048i-CH4-SW6" rel="nofollow">Read in the Property List</a>):</p> <pre><code>NSString *baseURL; NSString *path = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"]; NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; NSString *errorDesc = nil; NSDictionary *dict = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:&amp;errorDesc]; if (dict != nil) { baseUrl = dict[@"baseURL"]; } else { NSAssert(@"Could not read plist: %@", errorDesc); // FIXME: Return error } </code></pre> <p>There are other solutions of course. I personally generally use the preprocessor for this kind of problem. In my build configuration, I would set <code>GCC_PREPROCESSOR_DEFINITIONS</code> to include <code>BaseURL=...</code> for each build configuration and then in some header I would have:</p> <pre><code>#ifndef BaseURL #define BaseURL @"http://default.example.com" #endif </code></pre> <p>The plist way is probably clearer and easier if you have several things to set, especially if they're long or complicated (and definitely if they would need quoting). The preprocessor solution takes less code to process and has fewer failure modes (since the strings are embedded in the binary at compile time rather than read at runtime). But both are good solutions.</p>