目录

MyChat 企业 Android 保活与推送配置中心

本仓库已经实现一套同时覆盖完全隔离私网和公网混合环境的 Android 消息保活方案:

  • 完全私网:Android 前台常驻服务 + MobileIMSDK 自建 TCP 长连接。
  • 混合网络:自建长连接优先,消息未确认送达时使用阿里云移动推送兜底。
  • 云推送构建可选:纯私网 APK 默认不包含阿里云 SDK,也不会访问阿里云。
  • Rust 数据库配置中心统一管理 APP 品牌、推送、连接保活和运营参数。
  • Vue 后台支持分组编辑、图片上传、密钥脱敏、恢复默认、测试推送和审计历史。
  • Android 启动时本地优先读取配置和图片,网络刷新不阻塞启动页。

目录

MyChat/
├── MyChatServer/                  Rust 服务端和 Vue 管理后台
│   ├── src/modules/im/            IM 业务模块
│   ├── frontend/src/views/im/     IM 管理页面
│   └── json/                      业务初始化数据
└── client/android/                Android 客户端

功能说明

配置分组

后台菜单“即时通讯平台 → 平台配置”包含:

  1. APP_BRANDING
    • APP 名称
    • 应用内 Logo
    • 普通/深色启动背景图
    • 启动页开关和展示时长
  2. PUSH
    • 推送总开关
    • INTRANET_ONLYALIYUN_ONLYHYBRID 三种模式
    • 阿里云 AccessKey、AppKey、地域
    • 离线兜底延迟、重试次数和通知摘要开关
  3. CONNECTION
    • Android 前台常驻服务
    • 心跳、连接超时、最大重连间隔
    • 网络切换重连策略
  4. OPERATIONS
    • 注册开关
    • 维护模式和维护公告
    • 用户协议/隐私协议版本
    • 客服联系方式

消息投递流程

Rust 实时 TCP 投递
        │
        ├── 客户端确认成功 → 完成
        │
        └── 无法实时投递 → 写入 im_offline_message
                              │
                              └── 等待 PUSH_FALLBACK_DELAY_SECONDS
                                      │
                                      ├── 已确认 → 不发送云推送
                                      └── 未确认 → 阿里云 ACCOUNT 通知

Android 登录成功后会将 user_uid 绑定为阿里云 ACCOUNT。云通知只负责唤醒和提醒,完整消息仍由自建通道/离线消息接口同步。

数据库与密钥

新增表:

  • im_platform_config:平台配置定义和值。
  • im_platform_config_history:配置变更审计历史。

默认配置由 MyChatServer/json/im_platform_configs.json 初始化。

阿里云 AccessKey 可以保存在数据库,但 config_value 中保存的是 AES-256-GCM 密文。Rust 服务启动前必须设置独立主密钥:

export MYCHAT_CONFIG_MASTER_KEY='请替换为至少32字符的高强度随机密钥'

要求:

  • 主密钥不能放入数据库或提交 Git。
  • 生产环境应由 systemd、容器 Secret 或企业密钥管理系统注入。
  • 主密钥丢失后,数据库中的云密钥无法解密,需要在后台重新设置。
  • Vue 和 Android 接口均不会返回 AccessKey 明文。

本项目初始化策略面向开发环境。新增表会自动创建;如果修改已有表字段,应按项目规则删除开发数据库中的表并由初始化流程重建,不使用 ALTER TABLE 在线迁移。

Rust 服务端

cd MyChatServer
export MYCHAT_CONFIG_MASTER_KEY='请替换为至少32字符的高强度随机密钥'
cargo run

主要接口:

GET  /api/im/platform-config/groups
GET  /api/im/platform-config
PUT  /api/im/platform-config
POST /api/im/platform-config/reset
GET  /api/im/platform-config/history
POST /api/im/platform-config/assets
POST /api/im/platform-config/test-push

GET  /api/im/mobile/bootstrap-config
GET  /api/im/platform-assets/{id}

bootstrap-config 只返回 is_client_visible=true 的固定白名单字段。品牌图片下载接口也只允许访问当前配置实际引用的图片,不能借文件 ID 下载其他聊天图片。

Vue 管理后台

cd MyChatServer/frontend
pnpm install
pnpm dev

生产构建:

pnpm typecheck
pnpm build

图片上传限制为 10 MB,服务端会重新检查 MIME 和真实图片内容。敏感配置输入框遵循以下语义:

  • 留空保存:保留原密钥。
  • 输入新值:替换原密钥。
  • 点击“清除密钥”并确认:明确删除密钥。

Android 构建

Android Gradle Plugin 8.3 需要 JDK 17。示例:

cd client/android
export JAVA_HOME=/path/to/jdk-17

完全私网 APK

默认构建不包含阿里云 SDK:

./gradlew :app:assembleDebug

后台将 PUSH_MODE 设置为 INTRANET_ONLY。APP 使用:

  • 前台常驻通知服务
  • START_STICKY 服务恢复
  • 开机/应用升级后恢复服务(设备上存在已登录账号时)
  • MobileIMSDK 心跳和自动重连
  • 本地启动配置与品牌图片缓存

阿里云混合 APK

阿里云 SDK 是构建时能力。启用时传入 Android 应用的 AppKey 和 AppSecret:

./gradlew :app:assembleRelease \
  -PaliyunPushEnabled=true \
  -PaliyunPushAppKey='Android应用AppKey' \
  -PaliyunPushAppSecret='Android应用AppSecret'

请勿把真实 AppSecret 写入 gradle.properties 并提交仓库。应由企业 CI/CD Secret 注入,并对发布 APK 执行混淆、加固和签名保护。

后台再配置以下服务端参数:

  • ALIYUN_ACCESS_KEY_ID
  • ALIYUN_ACCESS_KEY_SECRET
  • ALIYUN_PUSH_APP_KEY
  • ALIYUN_REGION_ID
  • PUSH_MODE=HYBRID

Android SDK 的 AppKey/AppSecret 与 Rust 调用 OpenAPI 的 RAM AccessKey 是两套凭据,不能互相替代。RAM 用户应只授予移动推送所需的最小权限。

本实现采用阿里云移动推送 Android SDK 4.0.0,主 SDK 不等于各手机厂商辅助通道。当前没有接入华为、小米、OPPO、vivo 等独立厂商扩展包,因此不需要逐家申请账号;如以后需要更强的厂商离线送达率,可按需增加单个扩展包。

阿里云官方参考:

Android 启动配置行为

启动时不会等待网络:

  1. 读取 SharedPreferences 中最后一次成功配置。
  2. 立即加载应用私有目录中的已校验 Logo/启动图。
  3. 缓存不存在时使用 APK 内置资源。
  4. 后台请求最新配置版本。
  5. 下载图片到临时文件并校验 SHA-256。
  6. 校验成功后原子替换,下次启动使用新资源。

即使服务器不可达、设备熄屏或处于完全隔离网络,启动页都不会因等待远程图片而白屏。

已执行验证

Rust:
  cargo check
  cargo test modules::im --lib       14 passed

Vue:
  pnpm typecheck
  pnpm eslint src/views/im/config src/views/im/apis/platform-config.ts

Android 纯私网:
  ./gradlew :app:assembleDebug

Android 阿里云 SDK:
  ./gradlew :app:assembleDebug -PaliyunPushEnabled=true ...

两种 Android Debug 构建均已成功。阿里云真实推送仍需要有效的 EMAS 应用、RAM AccessKey、设备安装包和网络出口才能进行端到端验收。

关于
149.4 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号