capacitor.config.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import type { CapacitorConfig } from '@capacitor/cli';
  2. /**
  3. * Capacitor 配置 —— Android 打包的**唯一真源**(2026-11-15)
  4. *
  5. * ## 为什么 webDir 指到 dist/fmode-app-v2/browser
  6. *
  7. * 本项目是 Angular `@angular/build:application`,产物落在
  8. * `dist/<project>/browser/`。Capacitor 只认这个静态目录,
  9. * 所以必须先 `npm run build` 再用 `npx cap sync` 把它拷进 `android/app/src/main/assets/public/`。
  10. *
  11. * ## 为什么必须锁 server.hostname / androidScheme
  12. *
  13. * 🔴 这是打包后**最容易踩的坑**:
  14. * · 默认 `hostname = localhost`、`androidScheme = https` → origin 变成 `https://localhost`
  15. * · Capacitor 的 `_capacitor_file_` 协议下,WebView 对跨域请求的限制与浏览器一致
  16. * · 我们实测过 `s3.fmode.cn` / `server.fmode.cn` / `matrix.fmode.cn` 三个域名
  17. * 都能对 `https://localhost` 正常回 CORS 头,所以**直连可行**
  18. *
  19. * 锁死这两项是为了让 origin 稳定 —— 以后若要给平台报白名单,
  20. * 报的就是 `https://localhost` 这一个值,不会随版本漂移。
  21. *
  22. * ## 关于推送
  23. *
  24. * 本期**不接极光 SDK**(用户 2026-11-15 裁决)。原因见
  25. * `docs/02-design/plans/2026-11-14-手机端UX优化与Android打包方案.md`:
  26. * 没有服务端推送触发链路时,极光的核心价值(离线推送)用不上,
  27. * 本地通知用官方 `@capacitor/local-notifications` 即可。
  28. */
  29. const config: CapacitorConfig = {
  30. /** 🔴 用户 2026-11-15 拍板:一旦分发后改名 = 换签名 + 重装 */
  31. appId: 'cn.fmode.app',
  32. appName: 'Fmode',
  33. /** Angular 生产构建输出目录 */
  34. webDir: 'dist/fmode-app-v2/browser',
  35. /**
  36. * 追加 UA 标记。
  37. *
  38. * 服务端 / 埋点可以据此区分「Web 访问」与「App 内访问」,
  39. * 也方便线上排查时确认用户到底跑的是哪个壳。
  40. */
  41. appendUserAgent: 'FmodeApp/2.0',
  42. server: {
  43. /**
  44. * 固定为 https —— Android WebView 在 http 下会禁用部分能力
  45. * (Service Worker、部分安全上下文 API)。
  46. */
  47. androidScheme: 'https',
  48. /**
  49. * 固定 hostname:origin 稳定为 `https://localhost`。
  50. * 不去改它,避免 origin 随 Capacitor 版本漂移。
  51. */
  52. hostname: 'localhost',
  53. },
  54. android: {
  55. /**
  56. * 允许明文流量**关闭**(默认值,显式写出来是为了防止有人后来误开)。
  57. * 我们的后端全部是 https,没有例外。
  58. */
  59. allowMixedContent: false,
  60. },
  61. };
  62. export default config;