ios - 从 Crashlytics 迁移到 Firebase 时,如何处理一个 iOS 应用程序中的多个方案/目标?

标签 ios firebase crashlytics

我目前正在按照 Fabric 的指南将我的应用从 Crashlytics 迁移到 Firebase Crashlytics。

我的场景是,在我的应用程序中,我有四个不同的方案(四个目标),具有四个不同的包标识符,分别对应于我的开发、内部质量保证、客户端质量保证和实时服务器。

我为四个“应用程序”创建了四个不同的项目,就像我在 Fabric Crashlytics 中所做的那样。

现在,下一步是在我的项目中添加 Firebase 生成的“GoogleService-Info.plist”。我的四个应用程序的所有四个 Firebase 项目(实际上是同一应用程序的不同方案)生成了一个具有相同名称的 plist。目前看起来是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>AD_UNIT_ID_FOR_BANNER_TEST</key>
    <string>XXXXXXXX</string>
    <key>AD_UNIT_ID_FOR_INTERSTITIAL_TEST</key>
    <string>XXXXXXXXX</string>
    <key>CLIENT_ID</key>
    <string>XXXXXXXXXX</string>
    <key>REVERSED_CLIENT_ID</key>
    <string>XXXXX</string>
    <key>API_KEY</key>
    <string>XXXXXX</string>
    <key>GCM_SENDER_ID</key>
    <string>XXXXXXX</string>
    <key>PLIST_VERSION</key>
    <string>1</string>
    <key>BUNDLE_ID</key>
    <string>[MY SCHEME BUNDLE ID]</string>
    <key>PROJECT_ID</key>
    <string>[MY PROJECT ID]</string>
    <key>STORAGE_BUCKET</key>
    <string>XXXXXXXXX</string>
    <key>IS_ADS_ENABLED</key>
    <true></true>
    <key>IS_ANALYTICS_ENABLED</key>
    <false></false>
    <key>IS_APPINVITE_ENABLED</key>
    <false></false>
    <key>IS_GCM_ENABLED</key>
    <true></true>
    <key>IS_SIGNIN_ENABLED</key>
    <true></true>
    <key>GOOGLE_APP_ID</key>
    <string>XXXXXXXXX</string>
    <key>DATABASE_URL</key>
    <string>XXXXXXXXXXX</string>
</dict>
</plist>

我该怎么办?只需在我的项目中添加所有四个不同的名称?或者只是添加所有四个但修改每个的目标成员资格?毕竟,plist 中的包 ID、应用程序 key 是不同的。我们应该如何处理一个 iOS 应用程序中存在多个方案的情况?

最佳答案

这是我在项目中处理同样事情的方法。我保留了 4 个具有不同名称的 GoogleService-Info.Plist 文件,并将它们保存在我的项目的文件夹中。但请确保,您没有在项目导航器中添加相同的文件。(因此,这4个文件将驻留在我的项目文件夹中,但不会在我的项目中。简而言之,它不会自动编译。)

现在,您必须在每 4 个目标中添加运行脚本,以便以编程方式将每个 plist 文件的名称更改为所需名称,然后以编程方式将其添加到 bundle 中,以便仅从 4 个文件中选择一个具有所需名称的文件添加。

以下是如何执行上述步骤。

  1. 选择Target1(无论您的目标名称是什么)
  2. 现在,在顶部可用选项卡中选择“构建阶段”。
  3. 在这里,您将看到左上角的“+”按钮。单击它。
  4. 将会有多个选项,现在从那里选择New Run Script Phase。它将在您的列表中添加一个名为 Run Script 的新运行脚本。如果需要,您可以通过双击名称来更改其名称。就我而言,我保留了名称 RunScriptForGooglePlist
  5. 将会出现值为 /bin/shShell。就在其下方,将有一个 TextView ,您必须在其中编写以下代码。确保您根据 plist 文件的名称对文件进行必要的名称更改。

这里是相同的代码。

PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/MyProjectFolder/GooglePlists"

cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-dev.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

在这里,第一行代码,我正在获取所有 4 个 google plist 文件以 4 个不同名称保存的文件夹路径。

并且,在第二行中,我将此文件复制到新位置,这是我的应用程序的应用程序包,具有所需的名称。(正如我在顶部已经提到的,因为我们没有将这所有 4 个文件添加到包中,所以它们不会被编译。并且,应用程序包不会包含此文件。在此脚本中,您将将此必需的文件添加到其所需的位置(名称为 google/firebase 的 sdk 所需的名称)。

您必须对所有 4 个目标重复上述相同的过程,并且在上述代码的第二行中,只需根据给定目标的要求更改名称即可。

如果您没有执行上述任何步骤,或者仍然无法正常工作,请发表评论,我一定会帮助您。

关于ios - 从 Crashlytics 迁移到 Firebase 时,如何处理一个 iOS 应用程序中的多个方案/目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53557368/

相关文章:

objective-c - 使用 objective zip 解压 NSData

ios - 使用 AVAudioPlayer 时出现 "__CFRunLoopModeFindSourceForMachPort returned NULL"消息

ios - 保留 block 内部 block 的循环

node.js - Firebase功能错误; "Maximum call stack size exceeded"

firebase - 为什么 Flutter 会因为明显存在的 "missing getter"而失败?

ios - CGRectIntersectsRect 用于多个 CGRect

javascript - 工厂中的 Firebase 查询

android - 当使用 .xml 代替 google_services.json 时,Gradle 构建失败

android - 如何禁用上传 Firebase Crashlytics 的 alpha 和 beta 版本的映射文件?

android - 如果启用 proguard,则无法确定任务 ':app:crashlyticsStoreDeobsDebug' 的依赖关系