How to configure independent sets of runtime settings in Xcode

后端 未结 4 1622
遥遥无期
遥遥无期 2020-12-07 07:47

My iPhone application connects to three different servers, say: production, staging and testing. There is a bunch of confi

相关标签:
4条回答
  • 2020-12-07 08:26

    I would suggest using different build targets for each environment. I successfully used this model before. In your project's settings you can duplicate the current target and change the build settings as needed. There's an Info.plist File property that will let you change the default plist for that target.

    After that, you can create a scheme for each environment that will use the according target.

    You can get a step further and use different bundle id for each target and different names. That will allow you to install both the staging and the production builds on the same device for example.

    The only downside in this is that you have more work when you want to update provisioning profiles.

    0 讨论(0)
  • 2020-12-07 08:29

    Here's a much easier solution if the concerned libs allow to set the keys in code, meaning that you can have production value in your plist file, but change them in your AppDelegate (or whichever file they are first used in).

    Works with facebook, twitter and google sdk at the moment.

    Ex:

    #ifdef DEBUG
      // Facebook
      [FBSettings setDefaultAppID:@"SandboxID"];
      // Fabric / TwitterKit - must be called above [Fabric with:@[TwitterKit]];
      [[Twitter sharedInstance] startWithConsumerKey:@"SandboxKey" consumerSecret:@"SandboxIDSecret"];
    #endif
    

    Same in Swift, just use #if instead of #ifdef.

    Note about Facebook This worked with version 3 of their SDK, I'm not sure it's possible with later versions.

    0 讨论(0)
  • 2020-12-07 08:33

    It is probably very low tech but I just have a method called apiURL() that returns the URL of the API I want. I have localhost, stage, and production and I simply uncomment the one I want. It's worked well for me so far. I've only forgotten to switch it back a few times. Oops.

    0 讨论(0)
  • 2020-12-07 08:34

    A good way to do this would be with build configurations and C macros. This avoids having to create a separate target for every configuration which is not really the correct use of targets.

    First you want to set up the configurations at the project level:

    enter image description here

    You can create different configurations for debugging, enterprise distribution, and any other type of special build you want.

    Next you can define some macro flags for each configuration which will be passed to the compiler. You can then check for these flags at compile time. Find the "Preprocessor flags" build setting at the target level:

    enter image description here

    If you expand the triangle you can define different values for each of your configurations. You can define KEY=VALUE or just KEY macros here.

    enter image description here

    In your code, you can check for the existance of these macros, or their value (if there is one). For example:

    #ifdef DISABLE_FEATURE_X
        featureXButton.hidden = YES;
    #endif
    
    // ...
    
    #if FOOBAR_VISIBLE == 0
        foobarView.hidden = YES;
    #elif FOOBAR_VISIBLE == 1
        foorbarView.hidden = NO;
    #else
        #error Invalid value for FOOBAR_VISIBLE
    #endif
    

    You can pass in string values as well, which must be wrapped with single quotes in the build setting, e.g. DEFAULT_LOCALIZATION_NAME='@"en"'.

    You can also configure which configuration is used during Debug and Archive time using the Schemes editor. If you choose "Run" or "Archive" in the Schemes editor you can select the appropriate configuration.

    enter image description here

    If you need to parameterize entries in the Info.plist file, you can define their value using a custom build setting. Add a custom build setting for your target:

    enter image description here

    And then give it an appropriate value for your different configurations:

    enter image description here

    Then in the Info.plist file you can reference this setting:

    enter image description here

    Note that the one limitation of this approach is that you cannot change the following items:

    • Settings.bundle

    Additionally, in older versions of Xcode without asset catalog support, you cannot change the following items:

    • Icon.png
    • Default.png

    These cannot be explicitly defined in the Info.plist file or anywhere else, which means you need different targets to change them.

    Hope this helps.

    0 讨论(0)
提交回复
热议问题