Flutter同代码发布不同图标名称应用及应用识别方法问询
Flutter 单代码库发布双受众应用(爱犬/爱猫版)实现方案
核心思路
通过区分应用的包名/Bundle ID作为标识,在Flutter层自动加载对应受众的配置文件;同时在Android/iOS平台分别配置独立的应用信息(名称、图标、包名),实现一份代码发布两款差异化应用。
Flutter 层核心实现
1. 准备差异化配置文件
在assets目录下创建两个配置文件,分别对应爱犬和爱猫用户:
assets/dog_config.json:包含犬系主题色、文案、资源路径等assets/cat_config.json:包含猫系主题色、文案、资源路径等
示例配置(dog_config.json):
{ "appName": "爱犬乐园", "primaryColor": "#E64A19", "welcomeText": "欢迎来到汪星人世界!", "iconPrefix": "dog_" }
2. 获取应用标识并加载配置
使用package_info_plus插件获取当前应用的包名/Bundle ID,根据标识判断加载对应配置:
import 'dart:convert'; import 'package:flutter/services.dart'; import 'package:package_info_plus/package_info_plus.dart'; class AppConfig { late String appName; late String primaryColor; late String welcomeText; static Future<AppConfig> load() async { PackageInfo packageInfo = await PackageInfo.fromPackageInfo(); String configPath; // 根据包名判断应用类型 if (packageInfo.packageName == "com.yourcompany.dogapp") { configPath = "assets/dog_config.json"; } else if (packageInfo.packageName == "com.yourcompany.catapp") { configPath = "assets/cat_config.json"; } else { throw Exception("Unknown app flavor"); } // 读取配置文件 String jsonString = await rootBundle.loadString(configPath); Map<String, dynamic> jsonMap = json.decode(jsonString); AppConfig config = AppConfig(); config.appName = jsonMap["appName"]; config.primaryColor = jsonMap["primaryColor"]; config.welcomeText = jsonMap["welcomeText"]; return config; } }
在main.dart中初始化配置:
void main() async { WidgetsFlutterBinding.ensureInitialized(); AppConfig config = await AppConfig.load(); runApp(MyApp(config: config)); }
Android 平台配置(多Flavor实现)
1. 配置Product Flavors
打开android/app/build.gradle,在android节点下添加productFlavors:
android { // ... 其他配置 flavorDimensions "appType" productFlavors { dog { dimension "appType" applicationId "com.yourcompany.dogapp" // 犬系应用包名 resValue "string", "app_name", "爱犬乐园" // 应用名称 manifestPlaceholders = [appIcon: "@mipmap/ic_launcher_dog"] // 图标占位符 } cat { dimension "appType" applicationId "com.yourcompany.catapp" // 猫系应用包名 resValue "string", "app_name", "爱猫乐园" // 应用名称 manifestPlaceholders = [appIcon: "@mipmap/ic_launcher_cat"] // 图标占位符 } } }
2. 配置差异化图标
在android/app/src目录下创建dog和cat两个子目录,分别放置对应应用的图标资源:
src/dog/res/mipmap-xxxhdpi/ic_launcher_dog.pngsrc/cat/res/mipmap-xxxhdpi/ic_launcher_cat.png
修改AndroidManifest.xml中的图标引用为占位符:
<application android:label="@string/app_name" android:icon="${appIcon}"> <!-- ... 其他配置 --> </application>
3. 构建不同版本
使用命令行构建:
# 构建犬系应用APK flutter build apk --flavor dog # 构建猫系应用APK flutter build apk --flavor cat
或在Android Studio的Build Variants面板中选择对应的flavor(dogDebug/catRelease等)进行构建。
iOS 平台配置(多Target实现)
1. 复制Target创建多应用
打开iOS项目(ios/Runner.xcworkspace):
- 在Xcode左侧导航栏选中
RunnerTarget,右键选择Duplicate - 在弹出的窗口中选择Duplicate Only,将新Target命名为
DogApp和CatApp(分别对应两个受众)
2. 配置差异化信息
对每个Target分别设置:
- Bundle ID:在Signing & Capabilities面板中,为
DogApp设置com.yourcompany.dogapp,CatApp设置com.yourcompany.catapp - 应用名称:在Info.plist中修改
CFBundleDisplayName为对应名称("爱犬乐园"/"爱猫乐园") - 应用图标:
- 在Assets.xcassets中新建
DogIcon和CatIcon两个App Icon资源组,分别导入对应图标 - 选中Target,进入Build Settings面板,搜索
App Icon Source,选择对应的资源组(DogIcon/CatIcon)
- 在Assets.xcassets中新建
3. 构建不同版本
使用命令行构建:
# 构建犬系应用IPA flutter build ios --flavor dog --target ios/DogApp.xcworkspace # 构建猫系应用IPA flutter build ios --flavor cat --target ios/CatApp.xcworkspace
或在Xcode中选择对应的Scheme(DogApp/CatApp)进行构建。
内容的提问来源于stack exchange,提问作者David L
相关产品推荐
相关产品推荐

