Use different GoogleService-Info.plist for different build schemes

后端 未结 17 689
梦毁少年i
梦毁少年i 2020-12-07 07:49

I am using a build scheme for prod and one for staging (with 2 different bundle identifiers) and I am trying to use a separate GoogleService-Info.plist for each scheme. Is t

相关标签:
17条回答
  • 2020-12-07 08:20

    Let's suppose we have two configurations set, develop and production. You have to make two things:

    1. Rename both plists to conform to given configuration:
    • GoogleService-Info-develop.plist
    • GoogleService-Info-production.plist
    1. Add a run script which copies the correct plist for selected configuration:
    FIREBASE_PLIST_PATH="${PROJECT_DIR}/App/Resources/Plists/GoogleService-Info-${CONFIGURATION}.plist"
    echo "Firebase plist path: ${FIREBASE_PLIST_PATH}"
    cp -r ${FIREBASE_PLIST_PATH} "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
    

    A run script needs to be positioned before FirebaseCrashlytics script.

    You you can init firebase as you did before for single scheme: FirebaseApp.configure()

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

    Details

    Tested on:

    • Xcode 9.2
    • Xcode 10.2 (10E125)
    • Xcode 11.0 (11A420a)

    Solution

    1. Create folder with all your Google.plist files (with different names) in project

    1. Add run script

    Do not forget to change PATH_TO_GOOGLE_PLISTS value

    Code

    PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/SM2/Application/Firebase"
    
    case "${CONFIGURATION}" in
    
       "Debug_Staging" | "AdHoc_Staging" )
            cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-dev.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;
    
       "Debug_Poduction" | "AdHoc_Poduction" | "Distribution" | "Test_Poduction" )
            cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-prod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;
    
        *)
            ;;
    esac
    

    Build schemes names

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

    This is my solution!

    NSString *filePath;
    if([self isProduction]){
        filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
    }else{
        filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Sandbox" ofType:@"plist"];
    }
    FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
    [FIRApp configureWithOptions:options];
    

    And That's it!

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

    So I have pondered the same question and using some ideas from earlier posts, some of which publish apps with GoogleServices-Info.plist for all environments in all apps and that is a bit of a concern.

    I have come up with an extensible solution that copies the GoogleSerives-Info.plist file at build time. Further more this approach can support as many environments as you like with the ability to customise and follows a simple convention, making it easy to manage.

    First and foremost i have three environments, debug (For running in simulator and device whist debugging and actively cutting code), staging (for deployment to test flight) and release for production.

    Step one is to create your configuration(s):

    Select "Product" -> "Scheme" -> "Edit Scheme" and duplicate/create new as required. Go through each Scheme and assign its respective configuration from the "Build Configuration" drop down in each of the categories:

    I go a step further and uncheck "run" for Schemes that need to be distributed i.e. release and staging, and conversely uncheck "archive" for debug. You should do what makes sense for you.

    Under build phases add the following run scrip (CONFIGURATIONS_FOLDER variable can be customised as desired - just ensure you use the same folder name in the next step):

    # Get a reference to the folder which contains the configuration subfolders.
    CONFIGURATIONS_FOLDER=Firebase
    # Get a refernce to the filename of a 'GoogleService-Info.plist' file.
    GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
    # Get a reference to the 'GoogleService-Info.plist' for the current configuration.
    GOOGLESERVICE_INFO_PLIST_LOCATION=${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/${CONFIGURATION}/${GOOGLESERVICE_INFO_PLIST}
    # Check if 'GoogleService-Info.plist' file for current configuration exist.
    if [ ! -f $GOOGLESERVICE_INFO_PLIST_LOCATION ]
    then
      echo "No '${GOOGLESERVICE_INFO_PLIST}' file found for the configuration '${CONFIGURATION}' in the configuration directory '${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/${CONFIGURATION}'."
      exit 1
    fi
    # Get a reference to the destination location for the GoogleService-Info.plist.
    GOOGLESERVICE_INFO_PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
    # Copy 'GoogleService-Info.plist' for current configution to destination.
    cp "${GOOGLESERVICE_INFO_PLIST_LOCATION}" "${GOOGLESERVICE_INFO_PLIST_DESTINATION}"
    echo "Successfully coppied the '${GOOGLESERVICE_INFO_PLIST}' file for the '${CONFIGURATION}' configuration from '${GOOGLESERVICE_INFO_PLIST_LOCATION}' to '${GOOGLESERVICE_INFO_PLIST_DESTINATION}'."
    

    In your chosen configurations folder ("Firebase" in the above example) nest folders for each configuration named exactly the same as its respective configuration (case sensitive), inside of which place the respective GoogleServices-Info.plist files like so:

    Last but not least, i also like to ensure that a root level GoogleServices-Info.plist is not added into the project by accident so I add the following to my .gitignore.

    # Ignore project level GoogleService-Info.plist
    /[Project Name]/GoogleService-Info.plist
    
    0 讨论(0)
  • 2020-12-07 08:27

    I think it is not possible to achieve without using the GoogleService-Info.plist. Because before you can begin integrating your iOS app with the Google Sign-In components, you must download the dependencies and configure your Xcode project. And this process shows that GoogleService-Info.plist has a big factor on it.

    So the solutions and idea here in this SO question can help you with your problem. Just moved the main copy of the GoogleService-Info plist out of the app into 2 separate folders, then used the Build Phases "Copy Files" on each target to import the target specific plist into the Resources folder.

    Also check this SO question, it might give you more information/idea to your problem.

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

    Late but I think I must post this answer to help new developers, I found a very good article that resole my problem and I promise it can help you as well :)
    Check this article that resolve your problem as well.

    Step 1:
    Copy the GoogleService-Info.plist corresponding to your Firebase development environment into the Dev directory. Similarly, copy the GoogleService-Info.plist corresponding to your Firebase production environment in the Prod directory. Make sure to uncheck “Copy items if needed” and all targets under “Add to targets”.

    (Step 1 image link (I do not able to add image because of less reputations))

    Step 2:
    In the Xcode project navigator, select the app target. Switch to the Build Phases tab at the top, then add a New Run Script Phase. Name the phase “Setup Firebase Environment GoogleService-Info.plist”, or something to that effect, and place it before the “Copy Bundle Resources” step.

    Step 3:
    Implement a shell script that will copy the appropriate GoogleService-Info.plist into the app bundle based on the build configuration. Copy and paste the following shell script into the run script phase you just created:

    # Name of the resource we're selectively copying
    GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
    
    # Get references to dev and prod versions of the GoogleService-Info.plist
    # NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
    GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Dev/${GOOGLESERVICE_INFO_PLIST}
    GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Prod/${GOOGLESERVICE_INFO_PLIST}
    
    # Make sure the dev version of GoogleService-Info.plist exists
    echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"
    if [ ! -f $GOOGLESERVICE_INFO_DEV ]
    then
        echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
        exit 1
    fi
    
    # Make sure the prod version of GoogleService-Info.plist exists
    echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
    if [ ! -f $GOOGLESERVICE_INFO_PROD ]
    then
        echo "No Production GoogleService-Info.plist found. Please ensure it's in the proper directory."
        exit 1
    fi
    
    # Get a reference to the destination location for the GoogleService-Info.plist
    PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
    echo "Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}"
    
    # Copy over the prod GoogleService-Info.plist for Release builds
    if [ "${CONFIGURATION}" == "Release" ]
    then
        echo "Using ${GOOGLESERVICE_INFO_PROD}"
        cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
    else
        echo "Using ${GOOGLESERVICE_INFO_DEV}"
        cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
    fi
    
    0 讨论(0)
提交回复
热议问题