从 Crashlytics 迁移到 Firebase 时,如何在一个 iOS 应用程序中处理多个 schemes/targets?
How to handle multiple schemes/targets in one iOS app when migrating from Crashlytics to Firebase?
我目前正在按照 Fabric 的指南将我的应用程序从 Crashlytics 迁移到 Firebase Crashlytics。
我的场景是,在我的应用程序中,我有四种不同的方案(四个目标)和四个不同的包标识符,分别对应于我的开发、内部质量保证、客户端质量保证和实时服务器。
我为四个 "Apps" 创建了四个不同的项目,就像我在 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 中的 bundle ids、app keys 是不同的。我们应该如何处理一个 iOS 应用程序中的多个方案?
以下是我在我的项目中处理同样事情的方式。我保留了 4 个具有不同名称的 GoogleService-Info.Plist 文件,并将它们保存在我项目的文件夹中。但是请确保,您没有在项目导航器中添加相同的内容。(因此,这 4 个文件将驻留在我的项目文件夹中,而不是在我的项目中。简而言之,它不会自动编译。)
现在,您必须在每 4 个目标中添加 运行 脚本,以编程方式将每个 plist 文件的名称更改为所需的名称,然后以编程方式将其添加到捆绑包中,这样只有 4 个文件中的一个,需要的名称将被添加。
这是执行上述步骤的方法。
- Select
Target1
(无论你的目标名称是什么)
- 现在,Select 'Build Phases' 在可用的顶部选项卡中。
- 在这里,您会在左上角看到“+”按钮。点击它。
- 会有多个选项,现在 select
New Run Script Phase
从那里开始。它将在您的列表中添加一个新的 运行 脚本,名称为 Run Script
。如果需要,您可以通过双击名称来更改它的名称。在我的例子中,我保留了名字 RunScriptForGooglePlist
.
- 将有
Shell
个值为 /bin/sh
。在其下方,将有 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 个文件添加到包中,所以它们不会被编译。而且,app bundle 不会有这个文件。在这个脚本中,您将这个所需的文件添加到其所需的位置,名称为 google/firebase's sdk required)。
您必须重复上面的步骤,对所有 4 个目标执行相同的过程,并且在上面代码的第二行中,只需根据给定目标的需要更改名称即可。
如果您没有完成上述任何步骤或仍然无法正常工作,请发表评论,我一定会帮助您。
我目前正在按照 Fabric 的指南将我的应用程序从 Crashlytics 迁移到 Firebase Crashlytics。
我的场景是,在我的应用程序中,我有四种不同的方案(四个目标)和四个不同的包标识符,分别对应于我的开发、内部质量保证、客户端质量保证和实时服务器。
我为四个 "Apps" 创建了四个不同的项目,就像我在 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 中的 bundle ids、app keys 是不同的。我们应该如何处理一个 iOS 应用程序中的多个方案?
以下是我在我的项目中处理同样事情的方式。我保留了 4 个具有不同名称的 GoogleService-Info.Plist 文件,并将它们保存在我项目的文件夹中。但是请确保,您没有在项目导航器中添加相同的内容。(因此,这 4 个文件将驻留在我的项目文件夹中,而不是在我的项目中。简而言之,它不会自动编译。)
现在,您必须在每 4 个目标中添加 运行 脚本,以编程方式将每个 plist 文件的名称更改为所需的名称,然后以编程方式将其添加到捆绑包中,这样只有 4 个文件中的一个,需要的名称将被添加。
这是执行上述步骤的方法。
- Select
Target1
(无论你的目标名称是什么) - 现在,Select 'Build Phases' 在可用的顶部选项卡中。
- 在这里,您会在左上角看到“+”按钮。点击它。
- 会有多个选项,现在 select
New Run Script Phase
从那里开始。它将在您的列表中添加一个新的 运行 脚本,名称为Run Script
。如果需要,您可以通过双击名称来更改它的名称。在我的例子中,我保留了名字RunScriptForGooglePlist
. - 将有
Shell
个值为/bin/sh
。在其下方,将有 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 个文件添加到包中,所以它们不会被编译。而且,app bundle 不会有这个文件。在这个脚本中,您将这个所需的文件添加到其所需的位置,名称为 google/firebase's sdk required)。
您必须重复上面的步骤,对所有 4 个目标执行相同的过程,并且在上面代码的第二行中,只需根据给定目标的需要更改名称即可。
如果您没有完成上述任何步骤或仍然无法正常工作,请发表评论,我一定会帮助您。