========================================================================
 JiYan Cloud 云更新组件 版本更新说明
 版本：1.2     versionCode：4
 发布日期：2026-11-07
========================================================================

【一、本次更新摘要】
------------------------------------------------------------------------
1. 修复开启「安全请求校验」的应用无法获取更新、界面提示"接口无响应
   或验签失败"的问题。
2. 修复多文件云更新只能更新到最后一个文件的问题。
3. 修复"版本号相同但文件指纹不同"的更新被忽略、收不到新包的问题。
4. 优化单应用配置下的界面：不再显示无意义的「切换应用」按钮。
5. 重做应用选择窗口视觉，统一为圆角卡片风格。
6. 错误提示细化，便于定位是网络、解密、验签还是业务拒绝。

【二、修复内容】
------------------------------------------------------------------------
2.1 请求凭据补全
    问题：请求仅携带 token，未携带安全请求密码。应用开启
          cred_required=1 且已配置安全请求密码时，服务端凭据校验直接
          拒绝，返回"安全请求密码错误"。
    处理：请求参数顺序固定为
          action -> rc -> 业务参数 -> password -> token -> device_id
          password 恒定发送，即使为空也以空串占位（服务端按参数名
          取值，缺键与空串不等价）。签名算法不变，服务端可原样校验。
2.2 更新清单接口
    问题：更新阶段调用的是后台管理接口动作，该动作要求后台登录会话。
          客户端不具备会话，请求必然被拒，旧逻辑随后回退为"只取最后
          一个文件"，导致多文件更新不完整。
    处理：改为调用客户端专用的清单动作 get_update_manifest，一次返回
          该应用全部可更新文件（编号、名称、大小、MD5、来源）以及最新
          版本号、更新说明、剩余下载次数。权限不放大，原有凭据校验与
          签名校验全部保留，管理动作仍不对客户端开放。
    校验：客户端对清单做严格校验 —— 拒绝路径分隔符、"." 与 ".."、
          重复编号、重复文件名、非法来源、条目数超过 2000。
2.3 更新判定
    问题：原判断同时要求"需要更新"且"版本号不同"，导致版本号相同但
          文件指纹变化的热修复包被永久忽略。
    处理：仅以服务端 need_update 为准，不再比较版本号字符串。
2.4 应用身份解析
    问题：配置中若残留编号为空的占位应用项，会被当作有效应用，导致
          功能区出现只有一个选项的选择窗口。
    处理：仅接受正整数编号且不重复的应用项，空白或非法编号直接丢弃，
          并按有效应用数量决定界面行为。
2.5 下载异常提示
    问题：下载异常时把完整异常信息直接展示，可能包含下载地址与票据。
    处理：界面统一提示"下载连接失败或文件保存失败"，详细原因仅记录类
          名，日志不输出完整地址、票据、密钥、密文与响应原文。

【三、界面改进】
------------------------------------------------------------------------
3.1 单应用隐藏切换入口
    有效应用数量为 1 时，更新窗口与状态窗口不再渲染「切换应用」按钮，
    按钮行仅保留「稍后」与「立即更新」，不残留空位；点击区域同步移除。
3.2 应用选择窗口
    窗口背景改为透明，去除系统默认边距，卡片采用圆角白底与细描边，
    列表行高统一，取消按钮改为圆角样式。
3.3 版本显示
    标题栏版本号改为读取组件版本常量，避免显示与实际版本不一致。

【四、行为变化说明】
------------------------------------------------------------------------
- 请求与响应协议：新增统一协议层，集中处理参数顺序、顶层原始数据截取、
  响应验签与请求标识（rc）绑定。
- 响应验签：以响应中顶层原始数据字节为验签对象，不经过本地重新序列化，
  避免字段顺序变化导致误判。
- 请求标识绑定：成功响应必须携带与本次请求一致的标识，缺失或不一致
  一律视为失败。
- 未签名响应：当签名类型为 0（不签名）时，业务失败提示固定为
  "接口返回失败（响应未签名）"，不展示对端文案。
- 已签名响应：业务失败采用服务端返回的提示，并做控制字符清洗与长度
  限制。
- 错误分层：网络连接失败 / 响应解密失败 / 响应签名校验失败 /
  接口返回失败（响应未签名）/ 已验签业务提示 / 响应请求标识不匹配。

【五、兼容性与注意事项】
------------------------------------------------------------------------
- 接口地址保持主站 HTTPS 不变，未改为独立站点；如需切换，仅需修改
  接口常量，服务端动作已一致。
- 主站与既有接口全部保留，未删除、未更名。
- 配置下发方式不变，仍由宿主调用设置密文与 IV 的接口写入；未新增
  配置文件依赖。
- 签名证书已变更：本次使用新建签名库重新签名，与原证书不一致，
  新包无法覆盖安装，须先卸载旧版本再安装。
- 未在真实设备上执行完整更新流程验证，仅完成离线协议测试与安装包
  构建、签名校验。

【六、安装包校验】
------------------------------------------------------------------------
 SHA-256：
 9e8359d9e97919812b2413f49e72fc04e1987e1cd138a36588126c4173726636
========================================================================