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

Flu*_*ase 0 xcode ios firebase android-productflavors flutter

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

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

但是我对变革有很大的问题$(PRODUCT_BUNDLE_IDENTIFIER)。我需要.development在普通应用程序ID中添加后缀,以获取开发应用程序ID。

我已经尝试遵循此方法(使用“用户定义的设置”)并更改info.plist为从“用户定义的设置”获取变量,但是它不起作用。

错误是:

该操作无法完成。FrontBoard未知应用程序“ $(EXAMPLE_BUNDLE_ID)”。

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

我也尝试添加默认值PRODUCT_BUNDLE_IDENTIFIER和用户定义设置的混合方法。例如:com.example.app$(EXAMPLE_BUNDLE_ID)where 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这样的方法。

sha*_*eep 6

是否需要使用插件才能使用package name(Android)和bundle id(iOS)不同Firebase Auth

在这种情况下适用于iOS的项目,您shold考虑使用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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

然后,如果需要在登台和生产之间区分Firebase项目文件,可以在这里查看:

如何根据建筑风格在开发和生产火力基地项目之间进行选择?

更新

因此,在进行OP聊天之后,知道他正在按照本教程进行设置,flutter flavors所以我尝试了一下自己被困的地方。

起点如下:

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

我从Xcode开始bundle idGoogleService-Info.plist设置为生产(只是一个选择)

在此处输入图片说明

然后我将两者都保存GoogleServices-Info-staging.plistGoogleServices-Info-production.plist保存在我的ios / Runner文件夹中

在此处输入图片说明

然后,我会在 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
Run Code Online (Sandbox Code Playgroud)

我给它Setup Firebase Environment打电话(你可以随便叫什么)

在此处输入图片说明

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

在此处输入图片说明

现在关于SchemesBuild Configurations

我已经做了两个 Build Configuration,是我的确切副本,我Debug Build Configuration称他们为

在此处输入图片说明

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

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

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

在此处输入图片说明

在此处输入图片说明

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

如果我打电话给flutter run --flavor Debug-production我,我有一个可以在我的生产 Firebase项目上运行的构建。

在此处输入图片说明

在此处输入图片说明

更新2

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

在此处输入图片说明

无论如何,似乎有一种奇怪的行为,那就是,一旦您构建flavour了第二个flutter命令,就可以正确地构建风味,而运行previos构建风味

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

更新3

flutter tools稍加理解后,我发现在构建项目之前已设置了应用程序启动环境。因此,当我们CFBundleIdentifierInfo.plist第一次更改时,第二次启动时,flutter run它将采用先前修改的值,并在构建期间尝试启动此捆绑包ID,因为我们正在构建其他变体,因此正在更改它。

一个可能的解决方案是启动一个在调用之前更改内部内容的脚本CFBundleIdentifierInfo.plistfluetter run

例如Info.plist,以生产捆绑包ID为a 开头,com.example.flutterAppAuthFlavours我们可以执行类似的操作

在此处输入图片说明

在此处输入图片说明

在这里,我sed只是使用命令来思考不同的问题,但是您可以在调用之前始终调用下面的命令PlistBuddy进行更改flutter run