Firebase is an app development platform that helps you build and grow apps. We'll discuss a better approach to managing multiple googleservice info plists in xcode!
When you go to add a Firebase configuration file into your iOS project you’ll find that Google explains the most basic use case but says nothing about more advanced configurations. From their documentation they outline a two-step process:
Their documentation even says “if prompted, select to add the config file to all targets” which… depends. There is a blurb at the bottom which touches on the problem
If you have multiple bundle IDs in your project, you must associate each bundle ID with a registered app in the Firebase console so that each app can have its own
GoogleService-Info.plist
file.
Then they don’t talk at all about how you would go about doing that!
“GLHF — XO Google”
Here's what I did
Initial setup
Choose your bundle identifiers. Example: com.example.debug
for your Debug configuration and com.example
for your Release configuration.
Initialize your firebase projects and apps (you may only have one project and two apps, or two projects each with one app — dont get me started on that one) and download your GoogleService-Info.plist
files.
Setup Xcode
Create a Firebase
folder inside your target directory. Copy your GoogleService files into your new Firebase
folder. The names don’t matter — but choose identifiable names that make sense to you.
In Xcode navigate to Build Settings
for your specific target. Add a user-defined setting named GOOGLESERVICE_PATH
. Configure the value for each setting as the local path to the google service info plist file.
Navigate to Build Phases
for your target. Create a new Run Script Phase
. This script will copy the referenced GoogleService resource into the compiled app. The script will
produce an error if the value of GOOGLESERVICE_PATH
is empty, missing, or points to a location where the file does not exist
echo "Google Services Plist Path: ${GOOGLESERVICES_PATH}"
if [ -z "${GOOGLESERVICES_PATH}" ]; then
echo "GOOGLESERVICES_PATH is unset or set to the empty string"
exit 1
fi
if [ ! -f "${GOOGLESERVICES_PATH}" ]; then
echo "GOOGLESERVICES_PATH does not exist"
exit 2
fi
PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
cp "${GOOGLESERVICES_PATH}" "${PLIST_DESTINATION}"
echo "Copied ${GOOGLESERVICES_PATH} to final destination: ${PLIST_DESTINATION}"
Access The Value From Fastlane
You can read the value of the xcode build setting (the local path to your GoogleService-Info.plist file) using xcode_build_setting
Add the fastlane plugin to your Gemfile
gem "fastlane-plugin-xcode_build_setting", git: 'https://github.com/UpBra/fastlane-plugin-xcode_build_setting.git'
Run the fastlane action provided by the plugin
xcode_build_setting(
project: 'Firetruck.xcodeproj', # path to your xcode project
target: 'Firetruck', # the name of your target
configuration: 'Debug', # xcode configuration
key: 'GOOGLESERVICES_PATH' # name of your user defined build setting key
)
# Display the result
UI.message lane_context[SharedValues::XCODE_BUILD_SETTING_VALUE]
If the other fastlane actions you want to run only require a path to your GoogleService-Info.plist file — your work is done. If you’d like to read values from inside the plist file you can use google_services_plist_values
Add the plugin to your Gemfile
gem 'fastlane-plugin-google_services', git: 'https://github.com/UpBra/fastlane-plugin-google_services.git'
Run the fastlane action provided by the plugin
google_services_plist_values(
path: lane_context[SharedValues::XCODE_BUILD_SETTING_VALUE]
)
# Display the Google App Id
UI.message lane_context[SharedValues::GOOGLE_SERVICES_PLIST_VALUES_GOOGLE_APP_ID]
This article was originally posted by Blair on Medium