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这样的方法。
是否需要使用插件才能使用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 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
Run Code Online (Sandbox Code Playgroud)
我给它Setup Firebase Environment打电话(你可以随便叫什么)
该脚本还将一些日志(带有时间戳)存储在一个名为environment.txtinside ios文件夹的文件中,以便轻松检查xcode构建已完成
现在关于Schemes和Build Configurations:
我已经做了两个 Build Configuration,是我的确切副本,我Debug Build Configuration称他们为
Debug-Runner-stagingDebug-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稍加理解后,我发现在构建项目之前已设置了应用程序启动环境。因此,当我们CFBundleIdentifier在Info.plist第一次更改时,第二次启动时,flutter run它将采用先前修改的值,并在构建期间尝试启动此捆绑包ID,因为我们正在构建其他变体,因此正在更改它。
一个可能的解决方案是启动一个在调用之前更改内部内容的脚本。CFBundleIdentifierInfo.plistfluetter run
例如Info.plist,以生产捆绑包ID为a 开头,com.example.flutterAppAuthFlavours我们可以执行类似的操作
在这里,我sed只是使用命令来思考不同的问题,但是您可以在调用之前始终调用下面的命令PlistBuddy进行更改flutter run。
| 归档时间: |
|
| 查看次数: |
3849 次 |
| 最近记录: |