我正在使用不同的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这样的方法。
答案 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
无论如何,如果您不使用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 id
和GoogleService-Info.plist
设置为正式版(只是一个选择)
然后我将GoogleServices-Info-staging.plist
和GoogleServices-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
我称它为Setup Firebase Environment
(您可以根据需要将其命名)
此脚本还在environment.txt
文件夹内名为ios
的文件中将一些日志(带有时间戳)存储在文件中,以便轻松检查xcode构建已完成
现在关于Schemes
和Build Configurations
:
我已经完成了{strong>两个 Build Configuration
,它们是我的Debug Build Configuration
的精确副本,我称它们为
Debug-Runner-staging
Debug-Runner-production
经验法则是将构建配置命名为'Debug-<your flavor>'
,并且您需要为每种口味都制定一个方案,所以我有以下这些:
Runner-staging
,其Run调用 Debug-Runner-staging 构建配置Runner-production
,其运行调用 Debug-Runner-production 构建配置现在,如果我打电话给flutter run --flavor Debug-staging
,我的构建将在我的 staging firebase项目上运行。
,如果我打电话给flutter run --flavor Debug-production
,那么我有一个可以在我的 production firebase项目上运行的版本。
更新2
出于完整性考虑,您还可以在此处更改包ID:
无论如何,似乎有一种 奇怪的行为 :一旦您再次构建flavour
flutter
命令风味,但运行previos构建风味。
使用XCode
进行构建并使用方案进行切换时,所有的操作都可以按预期进行(甚至运行正确的应用程序),我想这可能是一个不稳定的命令问题。因此,我建议您尝试提出一个问题here并将此问题/答案也链接在一起。
更新3
经过一点点了解之后,我发现flutter tools
在构建项目之前设置了应用程序启动环境。因此,当我们第一次在CFBundleIdentifier
内部更改Info.plist
时,第二次启动flutter run
时,它将采用先前修改的值,并在构建期间尝试启动此bundle id,因为我们正在更改它,因为正在构建其他变体。
一种可能的解决方案是在调用CFBundleIdentifier
之前启动脚本来更改Info.plist
内部的fluetter run
。
例如,从生产捆绑包ID为Info.plist
的{{1}}开始,我们可以做类似的事情
在这里,我使用com.example.flutterAppAuthFlavours
命令只是为了有所不同,但是在致电sed
之前,您始终可以致电我们下面的PlistBuddy
进行更改。