Files

5.7 KiB
Raw Permalink Blame History

2026-09-22

排查:API 环境配置(lib/core/network/api_env.dart)

用户提问:kProdBaseUrl / kLocalBaseUrl 如何工作、如何保证正式包连真实后端。未改动代码,仅分析并给出改进建议。

机制(已确认)

  • baseUrl getter 三级优先级:--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 个风险点(重要,待处理)

  1. --dart-define 可击穿保证:其优先级最高且 release 同样生效。docs/Flutter打包与真机安装指南.md 第 203 行就给出了 flutter build apk --release --dart-define=API_BASE_URL=http://192.168.50.182:12345/api,一旦复制粘贴或 CI 残留,会产出指向局域网的"正式包"。
  2. profile 模式会连生产:kDebugMode 在 profile 下为 false → 走 kProdBaseUrl。flutter run --profile(做性能验证时常用)直接打生产库。建议改用 kReleaseMode 显式判断。
  3. 配置与文档/注释不一致,且 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。
  • 需重新构建并卸载后重装才能看到新名称/图标(启动器有缓存)。