对于不同的构建方案,使用不同的 GoogleService-Info.plist

我正在使用一个针对 prod 的构建方案和一个针对暂存的构建方案(使用两个不同的 bundle 标识符) ,并且我正在尝试使用一个单独的 GoogleService-Info。每个计划的表格。 在初始化 GCM (和 goole 登录)时,是否有任何方法手动选择要使用的 plist 文件?或者是否有可能避免使用 plist 并手动进行设置?

谢谢!

86254 次浏览

我认为不使用 GoogleService-Info.plist.是不可能实现的,因为在你开始集成你的 iOS 应用和 Google 登录组件之前,你必须下载依赖项并配置你的 Xcode 项目。 这个 程序表明 GoogleService-Info.plist对它有很大的影响。

所以这里的解决方案和想法在这个 有个问题可以帮助你解决你的问题。只需将 GoogleService-Info plist的主副本移出应用程序到2个单独的文件夹中,然后在每个目标上使用 Build Phases“ Copy Files”将目标特定的 plist 导入到 Resources 文件夹中。

也检查这个 有个问题,它可能会给你更多的信息/想法,你的问题。

我认为您可以使用这种方式动态配置 GoogleService-Info. plist,并为不同的捆绑包标识符使用不同的名称。

再见 安德里亚斯

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];

@ inidona 的答案对我很有效,在我把它改成 Swift 之后

对于 Swift 2.3:

let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info", ofType: "plist")
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configureWithOptions(options)

对于 Swift 3.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configure(with: options)

对于 Swift 4.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)
FirebaseApp.configure(options: options!)

以下是在 Xamarin 如何做到这一点 C # :

string plistPath = NSBundle.MainBundle.PathForResource ("GoogleService-Info", "plist");
Options options = new Options (plistPath);
App.Configure (options);

记住要包含 Firebase 名称空间:

using Firebase.Analytics;

这就是我的解决办法!

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];

就是这样!

看看这篇文章: https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164

在 Xcode 中,在项目中创建两个目录: DebugRelease

AppDelegate.mdidFinishLaunchingWithOptions方法内部,放置代码:

目标 C

  NSString *filePath;
#ifdef DEBUG
NSLog(@"[FIREBASE] Development mode.");
filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Debug"];
#else
NSLog(@"[FIREBASE] Production mode.");
filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Release"];
#endif


FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];

Swift 4

var filePath:String!
#if DEBUG
print("[FIREBASE] Development mode.")
filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Debug")
#else
print("[FIREBASE] Production mode.")
filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Release")
#endif


let options = FirebaseOptions.init(contentsOfFile: filePath)!
FirebaseApp.configure(options: options)

DebugRelease文件夹拖放到 Build Phases > Copy Bundle Resources:

Build Phases > Copy Bundle Resources

就是这样:)

对于 Xcode 9.2,我需要将两个目标的文件命名为“ googleServiceInfo.plist”,但是放置在不同的目录中,每个目标的目录/文件都在“ Build Phases”、“ Copy Bundle Resources”中指定。

以上并不是我喜欢的解决方案,但是我之前尝试过按照@inidona 的回答使用不同的文件名,转换成 Swift 4:

 let filePath = Bundle.main.path(forResource: "googleServiceInfo-Pro", ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)
FirebaseApp.configure(options: options!)

不幸的是,这并没有纠正 Firebase 错误消息。在这个问题: Firebase iOS SDK-使用 GoogleService 以外的配置文件 -Info.plist 生成控制台警告的原始海报似乎已经更新火力基地豆荚固定,但我还没有证实这一点。

细节

测试对象:

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

解决方案

  1. 在项目中创建包含所有 Google.plist 文件(不同名称)的文件夹

enter image description here

  1. 添加运行脚本

enter image description here

不要忘记更改 谷歌公司

密码

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

构建方案名称

enter image description here

如果 GoogleService-Info.plist有一个不同的名称,它将影响您的分析结果。Firebase 会警告你的.因此,这些运行时解决方案都不能提供最佳的分析结果。

有两种解决方案不会影响分析。

  1. 在每个方案 中使用不同的目标,并将每个版本的 GoogleService-Info.plist与它自己的目标关联起来。参见 Xcode 右手边的 档案检查员中的 目标成员。进一步信息 看这个问题

  2. 使用构建阶段脚本将 GoogleService-Info.plist的正确版本 复制到构建目录中。我使用不同的捆绑包 ID 进行分段和生产。这使我能够同时安装两个版本的应用程序。它还意味着通过下面的脚本,我可以用捆绑包 ID 来命名不同的 GoogleService-Info.plist文件。例如:

  • GoogleService-Info-com.example.app.plist
  • GoogleService-Info-com.example.app.staging.plist

构建阶段脚本

PATH_TO_CONFIG=$SRCROOT/Config/GoogleService-Info-$PRODUCT_BUNDLE_IDENTIFIER.plist
FILENAME_IN_BUNDLE=GoogleService-Info.plist
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"
cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"

注意: 您必须更改 PATH_TO_CONFIG以适应您的设置。

Build Phase Script

我注意到 google 希望代码中的文件名是 GoogleServiceInfo.plist:

 * The method |configureWithError:| will read from the file GoogleServices-Info.plist bundled with
* your app target for the keys to configure each individual API. To generate your
* GoogleServices-Info.plist, please go to https://developers.google.com/mobile/add
*
* @see GGLContext (Analytics)
* @see GGLContext (SignIn)
*/
@interface GGLContext : NSObject

关键词是这个

从 GoogleServices-Info.plist 文件中读取,该文件与应用程序目标绑定在一起

因此,我只是复制了同一个文件,把它放到不同的目录中,并将它绑定到不同的目标:

enter image description here

您不能避免使用与 Firebase 的 plist。到目前为止,我找到的最好的解决方案是添加这两个文件并为其命名

GoogleService-Info _ stage. plist

还有

GoogleService-Info _ prod. plist

然后从代码中调用正确的文件。如果你没有文件,这种方式不会使你的应用程序崩溃。只需将 FILENAME 替换为 GoogleService-Info _ prod 或 GoogleService-Info _ stage。

if let configFile = Bundle.main.path(forResource: "FILENAME", ofType: "plist"),
let options = FirebaseOptions(contentsOfFile: configFile)
{
FirebaseApp.configure(options: options)
}

很晚了,但是我想我必须发布这个答案来帮助新的开发者,我发现了一篇非常好的文章来解决我的问题,我保证它也能帮助你:)
检查解决您的问题的 这个文章。

第一步:
将与 Firebase 开发环境对应的 GoogleService-Info.plist复制到 戴夫目录中。类似地,在 刺痛目录中复制与 Firebase 生产环境对应的 GoogleService-Info.plist。确保取消选中 “复制项目,如果需要”“增加目标”下的所有目标。

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

第二步:
在 Xcode 项目导航器中,选择 app target。切换到顶部的“构建阶段”选项卡,然后添加 新的运行脚本阶段。将阶段命名为 “安装 Firebase Environment GoogleService-Info. plist”,或者类似的效果,并将其置于 “复制捆绑资源”步骤之前。

第三步:
实现一个 shell 脚本,该脚本将根据构建配置将适当的 GoogleService-Info.plist复制到应用程序包中。将下面的 shell 脚本复制并粘贴到您刚刚创建的运行脚本阶段:

# 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

我用这个解决了这个问题:

    #if STAGING
if let filePath = Bundle.main.path(forResource: "GoogleService-Info-Dev", ofType: "plist"),
let options = FirebaseOptions(contentsOfFile: filePath) {
FirebaseApp.configure(options: options)
} else {
fatalError("GoogleService-Info-Dev.plist is missing!")
}
#else
if let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist"),
let options = FirebaseOptions(contentsOfFile: filePath) {
FirebaseApp.configure(options: options)
} else {
fatalError("GoogleService-Info.plist is missing!")
}
#endif

这个答案很大程度上受到了 @ abbod答案的启发,但是对于如何做到这一点更具体一些。

对于每个目标,例如 dev,stg,prod:

  • 将相应的 GoogleService-Info.plist下载到以目标命名的单独文件夹中
  • 在 Xcode,右键单击应用程序文件夹并选择 Add files to "your app" enter image description here
  • 选择包含目标 GoogleService-Info.plist的文件夹,确保选择了 Copy items if neededCreate groups,只检查目标列表中的相应目标,然后按 Add enter image description here

就是这样,现在你应该有类似的结构

enter image description here

构建目标时,将使用正确的 GoogleService-Info.plist

如果有人出现错误并且 Xcode 抱怨

“多个命令生成 GoogleService-Info. plist”

在应用了“霹雳游侠”回应之后,你可能需要:

  • 检查 构建阶段 > 复制包资源
  • 过滤名为 GoogleService-Info.plist的文件
  • 删除任何与它有关的引用,因为 已经通过脚本复制了。

因此,我思考了同样的问题,并使用了一些来自早期文章的想法,其中一些在所有应用程序的所有环境中使用 GoogleServices-Info.plist发布应用程序,这有点令人担忧。

我提出了一个可扩展的解决方案,可以在构建时复制 GoogleSerives-Info.plist文件。此外,这种方法可以支持您喜欢的任意多个环境,并能够自定义和遵循简单的约定,从而使其易于管理。

首先,我有三个环境,debug(运行在模拟器和设备惠斯特调试和积极削减代码) ,staging(部署测试飞行)和 release的生产。

第一步是创建您的配置:

enter image description here

选择“产品”-> “方案”-> “编辑方案”,并根据需要复制/创建新的。中遍历每个方案并分配其各自的配置 “构建配置”在每个类别中下拉:

enter image description here

我更进一步,为需要分发的方案(即发布和暂存)取消选中“ run”,为调试取消选中“ archive”。你应该做对你有意义的事。

enter image description here

在构建阶段添加以下运行脚本(CONFIGURATIONS_FOLDER变量可以根据需要进行定制——只需确保在下一步中使用相同的文件夹名称) :

# 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}'."

enter image description here

在您选择的配置文件夹(上面例子中的“ Firebase”)中,每个配置的嵌套文件夹的名称与其各自的配置完全相同(区分大小写) ,其中放置相应的 GoogleServices-Info.plist文件如下:

enter image description here

最后但同样重要的是,我还希望确保根级别的 GoogleServices-Info.plist不会意外地添加到项目中,因此我将下面的内容添加到我的。吉蒂诺尔。

# Ignore project level GoogleService-Info.plist
/[Project Name]/GoogleService-Info.plist

假设我们有两个配置,developproduction。你必须做两件事:

  1. 重命名两个 plist 以符合给定的配置:
  • GoogleService-Info-development. plist
  • GoogleService-信息生产
  1. 添加一个运行脚本,为选定的配置复制正确的列表:
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"

运行脚本需要放在 FirebaseCrashlytics脚本之前。

您可以像以前一样为单个方案初始化 firebase: FirebaseApp.configure()

我发现在单一目标的情况下,唯一100% 可行的方法是在构建过程中复制与构建配置相对应的 plist; 但是这里的答案在如何做的细节上有所不同,对我来说没有一个是足够方便的。我的答案是基于 回答的@KnightFfight 和 这个在 Medium 上的文章。


首先,将所有不同的 plist 添加到具有不同名称的项目中(它们不能作为资源添加到目标中) :

enter image description here

接下来创建用户定义的生成设置,您可以在其中为每个生成配置分配特定的 plist:

enter image description here

最后添加“运行脚本”阶段的代码:

GOOGLE_SERVICE_INFO_PLIST_SOURCE=${PROJECT_DIR}/${TARGET_NAME}/${GOOGLE_SERVICE_INFO_PLIST_FILENAME}


if [ ! -f $GOOGLE_SERVICE_INFO_PLIST_SOURCE ]
then
echo "${GOOGLE_SERVICE_INFO_PLIST_SOURCE} not found."
exit 1
fi


GOOGLE_SERVICE_INFO_PLIST_DESTINATION="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"


cp "${GOOGLE_SERVICE_INFO_PLIST_SOURCE}" "${GOOGLE_SERVICE_INFO_PLIST_DESTINATION}"

我认为这种方式有一些优点:

  • 不需要有文件夹层次结构来存储清单;
  • 如果单列表用于多个配置,则不需要复制文件;
  • 如果需要添加配置或重新分配 plist,在构建设置中更改文件名比编辑脚本更容易; 特别是对于非程序员(比如构建管理器)。

@ Vasily Bodnarchuk 的回答对我很有用。你唯一需要注意的是 Xcode 的剧本有一个精确的顺序,所以你需要把这个剧本作为第一个,在剧本之前

${PODS_ROOT}/FirebaseCrashlytics/run

还有

"${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" -gsp "${PROJECT_DIR}/<yourapp>/Configuration Files/GoogleService-Info-dev.plist" -p ios "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"

这是我的版本@Essam 的解决方案。

  1. 为默认方案生成 GoogleServices 版本 (Google-Services.plist)具有默认标识符
  2. 生成第二个 GoogleServices 版本 用于具有正确标识符的变体方案(Google-Services-debug.plist)
  3. 把两者都加到 你的项目的根(在那里它告诉你在他们的指南)

在您添加 configure 的地方添加以下代码:

        let bundleID = Bundle.main.bundleIdentifier
if (bundleID!.contains("debug")) {
let resource: String = "GoogleService-Info-debug"
let filePath = Bundle.main.path(forResource: resource, ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)
FirebaseApp.configure(options: options!)
} else {
FirebaseApp.configure()
}

对于那些想在快车道做的人来说。

您可以使用 Fastlane (fastlane-plugin-file _ manager)的文件管理器插件来运行一个简单的 copy 命令。

  1. 以标准方式将 GoogleService-info-app. plist 添加到 xcode 项目中,以便正确链接。

  2. 使用复制文件将链接文件覆盖在构建/测试版中所需的文件中。

    Copy _ files (源: “ firebase/GoogleService-Info-”+ ENV [“ APP _ IDENTIFIER”] + “ . plist”,目的地: “ GoogleService-Info. plist”)

对于多个方案,如 Stage,QA,UAT 和 PROD,一个目标下面的脚本为我工作。 我还用它们的配置名维护了.xcconfig 文件

 # 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. ENV_NAME name is the folder name(Dev,QA,Uat,Prod)
which i have in my .xcconfig file for each environment.
GOOGLESERVICE_INFO_PLIST_LOCATION=${PROJECT_DIR}/${TARGET_NAME}
/${CONFIGURATIONS_FOLDER}/${ENV_NAME}/${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}'."

虽然来晚了,但我已经为此实现了一个解决方案。 首先,你可以像下面这样列出你的清单: GoogleService-Info-target1

GoogleService-Info-target2

GoogleService-Info-target3

然后通过添加一个新的运行脚本阶段,在每个目标的构建阶段选项卡中添加以下脚本:

PATH _ TO _ PLISTS = “ ${ PROJECT _ DIR }/${ PROJECT _ NAME }/(包含 中的“ ${ TARGET _ NAME }”大小写

“ target1 name”) cp-r “ $PATH _ TO _ PLISTS/GoogleService-Info-target1. plist” “ ${ BUILT _ PRODUCTS _ DIR }/${ PRODUCT _ NAME } . app/GoogleService-Info. plist” ;;

“ target2 name”) cp-r “ $PATH _ TO _ PLISTS/GoogleService-Info-target2. plist” “ ${ BUILT _ PRODUCTS _ DIR }/${ PRODUCT _ NAME } . app/GoogleService-Info. plist” ;;

“ target3 name”) cp-r “ $PATH _ TO _ PLISTS/GoogleService-Info-target3. plist” “ ${ BUILT _ PRODUCTS _ DIR }/${ PRODUCT _ NAME } . app/GoogleService-Info. plist” ;;

*) ;

! 终于它的工作,为 macOS 应用程序。

感谢@vasily-bodnarchuk 为 iOS 应用程序提供的解决方案,但是对于 macOS 应用程序,它几乎不需要在脚本文件中进行额外的修改。

只需为 macOS“ 目录资源”追加指定的资源目录。请检查详细信息 复制 Bundle Resources

密码

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/Contents/Resources/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/Contents/Resources/GoogleService-Info.plist" ;;


*)
;;
esac