如何在Xcode中更改$(PRODUCT_BUNDLE_IDENTIFIER)?

时间:2019-02-03 19:05:12

标签: ios xcode firebase flutter android-productflavors

我正在使用不同的Firebase环境(开发和生产)构建不同口味的Flutter应用程序。我需要为iOS应用程序的Xcode中的开发和生产设置不同的包ID。

我正在使用方案来配置不同的样式(在“构建设置”中,我为每个配置添加环境值)。

但是我对更改$(PRODUCT_BUNDLE_IDENTIFIER)有很大的疑问。我需要在普通应用程序ID中添加后缀.development作为开发应用程序ID。

我尝试遵循this method(使用用户定义的设置)并更改info.plist以从“用户定义的设置”中获取变量,但这不起作用。

错误是:

  

该操作无法完成。应用   FrontBoard不知道“ $(EXAMPLE_BUNDLE_ID)”。

因此,在传递“用户定义的设置”时,似乎插值不正确。

我也尝试添加默认PRODUCT_BUNDLE_IDENTIFIER和用户定义的设置的混合方法。例如:com.example.app$(EXAMPLE_BUNDLE_ID),其中EXAMPLE_BUNDLE_ID = .development

我也尝试通过将用户定义的设置$(EXAMPLE_BUNDLE_ID)直接添加到“身份”下的“目标常规”标签中的“捆绑包标识符”来尝试引用它。但这然后更改为:-- EXAMPLE_BUNDLE_ID-

我也尝试在info.plist中使用$(PRODUCT_BUNDLE_IDENTIFIER)$(EXAMPLE_BUNDLE_ID)作为Bundle Identifier值。但这给出了类似的错误:

  

该操作无法完成。应用   FrontBoard不知道“ com.example.app $(EXAMPLE_BUNDLE_ID)”。

再次看起来像插值问题。

有人知道解决方案吗?我看了但是找不到答案。

这对于android来说很容易,因为只需在applicationIdSuffix ".development”中使用productFlavors。但是我找不到Xcode这样的方法。

1 个答案:

答案 0 :(得分:1)

由于需要使用package name插件,您需要使用不同的bundle id(Android)和Firebase Auth(iOS)吗?

在这种情况下,对于iOS项目,您可以考虑使用PlistBuddy,可以将其设置为在Run Script中添加XCode build phases

if [ "${CONFIGURATION}" = "Debug" ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.developmento.appName" "$PROJECT_DIR/Runner/Info.plist"
echo "Changed bundle id for developement $PROJECT_DIR/Runner/Info.plist"
else
echo "Nothing to do"
fi

enter image description here

无论如何,如果您不使用Firebase Auth,则可以在不同的Firebase项目中使用相同的包ID。

如果您需要在过渡和生产之间区分Firebase项目文件,可以在这里查看:

How to choose between development and production firebase project based on build flavours?

更新

因此,在进行OP聊天之后,知道他正在遵循tutorial来设置flutter flavors,所以我尝试着自己看看我们被困在哪里。

起点如下:

  • 两个 Firebase project
  • 使用Firebase Auth模块(因此需要更改项目之间的包ID)
  • 当然还有两个不同的GoogleService-Info.plist

我首先将Xcode bundle idGoogleService-Info.plist设置为正式版(只是一个选择)

enter image description here

然后我将GoogleServices-Info-staging.plistGoogleServices-Info-production.plist都保存到了ios / Runner文件夹中

enter image description here

然后我在Compile Sources的脚本之前设置此构建脚本

# Type a script or drag a script file from your workspace to insert its path.
if [ "${CONFIGURATION}" == "Debug" ] || [ "${CONFIGURATION}" == "Debug-Runner-staging" ]; then 

echo "Setting up staging firebase environment"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.staging.flutterAppAuthFlavours" "${PROJECT_DIR}/Runner/Info.plist"
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-staging.plist" "${PROJECT_DIR}/Runner/GoogleService-Info.plist" 
echo "$(date) staging flavour - Configuration: ${CONFIGURATION}" > "${PROJECT_DIR}/environment.txt"

elif [ "${CONFIGURATION}" == "Debug-Runner-production" ]; then 

echo "Setting up production firebase environment"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.flutterAppAuthFlavours" "${PROJECT_DIR}/Runner/Info.plist" 
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-production.plist" "${PROJECT_DIR}/Runner/GoogleService-Info.plist"
echo "$(date) production flavour - Configuration:  ${CONFIGURATION}" > "${PROJECT_DIR}/environment.txt"

fi

我称它为Setup Firebase Environment(您可以根据需要将其命名)

enter image description here

此脚本还在environment.txt文件夹内名为ios的文件中将一些日志(带有时间戳)存储在文件中,以便轻松检查xcode构建已完成

enter image description here

现在关于SchemesBuild Configurations

我已经完成了{strong>两个 Build Configuration,它们是我的Debug Build Configuration的精确副本,我称它们为

enter image description here

  • Debug-Runner-staging
  • Debug-Runner-production

经验法则是将构建配置命名为'Debug-<your flavor>',并且您需要为每种口味都制定一个方案,所以我有以下这些:

  • Runner-staging,其Run调用 Debug-Runner-staging 构建配置
  • Runner-production,其运行调用 Debug-Runner-production 构建配置

enter image description here

enter image description here

现在,如果我打电话给flutter run --flavor Debug-staging,我的构建将在我的 staging firebase项目上运行。

,如果我打电话给flutter run --flavor Debug-production,那么我有一个可以在我的 production firebase项目上运行的版本。

enter image description here

enter image description here

更新2

出于完整性考虑,您还可以在此处更改包ID:

enter image description here

无论如何,似乎有一种 奇怪的行为 :一旦您再次构建flavour flutter命令风味,但运行previos构建风味

使用XCode进行构建并使用方案进行切换时,所有的操作都可以按预期进行(甚至运行正确的应用程序),我想这可能是一个不稳定的命令问题。因此,我建议您尝试提出一个问题here并将此问题/答案也链接在一起。

更新3

经过一点点了解之后,我发现flutter tools在构建项目之前设置了应用程序启动环境。因此,当我们第一次在CFBundleIdentifier内部更改Info.plist时,第二次启动flutter run时,它将采用先前修改的值,并在构建期间尝试启动此bundle id,因为我们正在更改它,因为正在构建其他变体。

一种可能的解决方案是在调用CFBundleIdentifier之前启动脚本来更改Info.plist内部的fluetter run

例如,从生产捆绑包ID为Info.plist的{​​{1}}开始,我们可以做类似的事情

enter image description here

enter image description here

在这里,我使用com.example.flutterAppAuthFlavours命令只是为了有所不同,但是在致电sed之前,您始终可以致电我们下面的PlistBuddy进行更改。