5.7 KiB
5.7 KiB
2026-09-22
排查:API 环境配置(lib/core/network/api_env.dart)
用户提问:kProdBaseUrl / kLocalBaseUrl 如何工作、如何保证正式包连真实后端。未改动代码,仅分析并给出改进建议。
机制(已确认)
baseUrlgetter 三级优先级:--dart-define=API_BASE_URL(String.fromEnvironment,编译期)>!kDebugMode时kProdBaseUrl> 默认kLocalBaseUrl。- 消费方:
dio_client.dart的dioProvider把baseUrl塞进BaseOptions.baseUrl;API 层(如auth_api.dart)只用相对路径/auth/login,由 dio 拼接。 - 正式包的保证来自编译期常量折叠:release 下
kDebugMode == false,return kLocalBaseUrl成为死代码被 tree-shake,本地地址字符串不会进入产物。
发现的 3 个风险点(重要,待处理)
--dart-define可击穿保证:其优先级最高且 release 同样生效。docs/Flutter打包与真机安装指南.md第 203 行就给出了flutter build apk --release --dart-define=API_BASE_URL=http://192.168.50.182:12345/api,一旦复制粘贴或 CI 残留,会产出指向局域网的"正式包"。- profile 模式会连生产:
kDebugMode在 profile 下为 false → 走kProdBaseUrl。flutter run --profile(做性能验证时常用)直接打生产库。建议改用kReleaseMode显式判断。 - 配置与文档/注释不一致,且 iOS 会直接失败:
- 代码
kProdBaseUrl = 'http://103.36.220.231:12345/api'(明文 HTTP + 裸 IP + 非标端口),但同文件注释写"生产环境 HTTPS",docs/Flutter打包与真机安装指南.md第 178 行写的是https://accounting.aqroid.cn/api。 - Android 端能跑,是因为
android/app/src/main/AndroidManifest.xml开了android:usesCleartextTraffic="true"(而打包指南第 350 行却说"生产是 HTTPS,其实可以不开")。 - iOS 端
ios/Runner/Info.plist中完全没有NSAppTransportSecurity配置,请求该 http 地址会被 ATS 拦截(URLError -1022),iOS 正式包无法联网。 - Web 端若部署在 HTTPS 页面下,浏览器会以 mixed content 拦截 http 请求(另有 CORS 问题)。
- 硬编码裸 IP:换服务器/加域名/上 HTTPS 都必须重新打包发版。
- 代码
给用户的改进方向(尚未实施)
baseUrl判断改为显式kReleaseMode,并处理 profile(如新增kProfileBaseUrl或按需回退)。- 生产改用域名 + HTTPS,同步更新 Android 明文流量开关与 iOS ATS 例外。
- 多环境改用
--dart-define-from-file=config/prod.json,避免长命令行被误复制。 - 增加运行时自检:release 下若
API_BASE_URL非空则报错/显著日志;启动时打印当前 baseUrl。
实施:App 名称与图标(已完成)
用户提供品牌原图位置 D:\nzy\workspace_nzy\AI-accounting-soft-uniApp\static\images\logo.png(与项目内 assets/images/logo.png 同一张),要求改名 + 换图标。
关键结论:原 logo 不能作图标
该图为 1120×928 贴纸海报(熊头 + 3 只狗 + "强宝爱记账"5 个大字),带虚化底纹。实测用洪水填充/PIL 去背景失败(底纹色差超出阈值,水印残留),且缩小到 48px 后文字糊成一团。已明确告知用户并改为同画风专用素材。
已完成改动
| 内容 | 文件 | 值 |
|---|---|---|
| Android 桌面名 | android/app/src/main/AndroidManifest.xml |
android:label="强宝爱记账" |
| iOS 桌面名 | ios/Runner/Info.plist |
CFBundleDisplayName = 强宝爱记账 |
| Web 标签页/主屏名/描述 | web/index.html |
<title>、apple-mobile-web-app-title 均为 强宝爱记账 |
| Web PWA | web/manifest.json |
name=强宝爱记账、short_name=强宝记账、background_color=#FFF6EC、theme_color=#C8956E |
| 图标依赖 | pubspec.yaml |
新增 dev 依赖 flutter_launcher_icons: ^0.14.0(实际解析到 0.14.4) |
| 图标配置 | pubspec.yaml 末尾 |
新增 flutter_launcher_icons 段(image_path + adaptive 双层 + remove_alpha_ios + web) |
| 文档 | docs/Flutter打包与真机安装指南.md 7.3 节 |
重写为实际链路 |
新增的文件与链路
tools/make_app_icon.py:从素材生成图标。功能 = 去右下角 AI 水印(用上方一行像素向下延展填充,适配平滑渐变底)→ 按四角平均色做背景掩码抠出主体 → 居中缩放。产出assets/icon/app_icon.png(RGB 无 alpha)与assets/icon/app_icon_fg.png(RGBA,主体占 60%,供自适应前景层)。支持--preview(输出构图预览)、--check(核对色彩模式)、--src(换素材)。assets/icon/_source/raw_bear.png:最终采用素材(AI 生成的 kawaii 棕熊头,奶油底 #FFF6EC)。assets/icon/_source/raw_bear_dog.png:备选素材(熊 + 金毛),待用户选择。- 注意:
assets/icon/未在 pubspec 声明为 assets,不会打进包。
生成与校验结果
flutter pub get成功(走 pub.flutter-io.cn 镜像);dart run flutter_launcher_icons成功。- Android:5 套 mipmap +
mipmap-anydpi-v26/ic_launcher.xml+ 新建res/values/colors.xml+drawable-*/ic_launcher_foreground.png。 - iOS:
AppIcon.appiconset全套 22 张,1024 图确认为 RGB 无 alpha(合规)。 - Web:
web/icons/*+web/favicon.png。 flutter analyze→ No issues found。
待用户确认
- 是否改用备选素材
raw_bear_dog.png(熊 + 金毛,更贴近原 logo 的"熊+狗"组合),换法:python tools/make_app_icon.py --src assets/icon/_source/raw_bear_dog.png && dart run flutter_launcher_icons。 - 需重新构建并卸载后重装才能看到新名称/图标(启动器有缓存)。