64 lines
5.7 KiB
Markdown
64 lines
5.7 KiB
Markdown
# 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`。
|
||
- 需重新构建并**卸载后重装**才能看到新名称/图标(启动器有缓存)。
|
||
|