Skip to content

fix(mobile): 修复 iOS HDR 截图发送失败 - #3905

Merged
DavidShenXD merged 2 commits into
mainfrom
cindy/silent-leakey
Sep 7, 2026
Merged

fix(mobile): 修复 iOS HDR 截图发送失败#3905
DavidShenXD merged 2 commits into
mainfrom
cindy/silent-leakey

Conversation

@DavidShenXD

Copy link
Copy Markdown
Collaborator

这次改了什么

摘要

修复 iOS 手机截图在方向归一化时处理 HDR / 10-bit HEIC 失败,导致图片发送报错 ERR_IMAGE_CONTEXT_LOST 的问题。补丁参考了 Expo 同类修复路径:正常方向直接复用原图,其他方向使用系统 UIGraphicsImageRenderer 绘制。

变更类型

  • fix 缺陷修复
  • feat 新功能
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:iOS 特定机型发送手机截屏的图片失败 #3889
  • 本 PR 包含:expo-image-manipulator@57.0.14 的 iOS 原生补丁、patch 登记和 lockfile 更新。
  • 明确不包含:服务端改动、Android 原生逻辑、UI 调整及图片业务流程改造。
  • 用户可见变化:兼容受影响机型的手机截图发送;正常图片处理路径不变。
  • 是否存在 breaking change:无

UI 变化

不涉及:仅修改 Mobile 依赖的 iOS 原生图片方向归一化实现,没有界面、布局、样式、交互或文案变化。

  • 引用的设计规范:不涉及 UI。

怎么验证的

自动验证

pnpm install --frozen-lockfile
git apply --check(补丁可应用到原始 npm 包)
pnpm --filter mobile run --if-present typecheck
pnpm --filter mobile test:scope
pnpm test:unit:related(因 package.json / pnpm-lock.yaml 改动退回全量单测)

结果:以上命令全部通过;Desktop、Mobile、maker-core 及要求的 workspace 单测均通过。

手工验证

未执行:当前环境为 Windows,无法编译 iOS Swift;尚未在 iOS 26 HDR / SDR 真机上回归。

未执行的验证

  • 未执行 macOS iOS 构建及 iOS 26 HDR / SDR 真机验证,原因是当前环境为 Windows。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:iOS 原生依赖补丁会改变 iOS runtime fingerprint;旧装机无法接收该新指纹及其后续 OTA,需安装包含本补丁的新冷更包。Android fingerprint 不变,Android 逻辑不受影响。
  • 回滚 / 降级方式:随 iOS 冷更包发布;如真机回归发现问题,可移除该 patch 登记并恢复原始依赖实现后重新构建冷更包。
  • 冷更建议:随下一次 iOS 冷更发布,并在发布前完成 HDR / SDR 真机验证;在指定把关人明确确认前保持 Draft。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 修复补丁文件与 pnpm-lock.yaml 哈希不一致问题。

变更:

  • 恢复 patch context 空格,使 SHA-256 与 lockfile 记录的 78594ca2235bdbbee2665f37b86d4e1e892733c4f9bd38fa7085338b90486e2b 一致。
  • 提交 362ae59 并推送到 PR 分支。

验证:

  • GitHub Actions 全部通过:依赖安装、Linux / Windows 单测、Desktop Git integration、verify、CodeQL、DCO。

备注:

  • iOS 原生编译及 HDR / SDR 真机回归仍需 macOS 和目标机型完成;PR 继续保持 Draft,等待冷更把关确认。

@DavidShenXD
DavidShenXD marked this pull request as ready for review September 7, 2026 03:35
@DavidShenXD
DavidShenXD requested a review from a team as a code owner September 7, 2026 03:35
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

验证更新\n\n已验证:\n- 用户已在 iOS 模拟器上验证手机截图发送流程通过。\n\n状态:\n- PR 已从 Draft 切换为 Ready for review。\n\n备注:\n- iOS HDR / SDR 目标真机回归仍可在后续发布前继续补充。\n

@greptile-apps

greptile-apps Bot commented Sep 7, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 为 expo-image-manipulator@57.0.14 增加 iOS 原生补丁,避免 HDR/10-bit HEIC 图片在方向归一化时因手工创建 CGContext 失败。

  • .up 方向直接复用原图。
  • 其他方向改由 UIGraphicsImageRenderer 绘制并归一化。
  • 根依赖补丁配置与 lockfile 已同步,并补充了补丁用途及移除条件说明。
  • 未发现由本次变更引入的具体、可执行问题。

Confidence Score: 5/5

当前变更看起来可以安全合并,未发现会阻止补丁安装、iOS 构建消费或图片处理流程正常工作的具体缺陷。

补丁版本、登记路径和 lockfile 引用一致;新的方向归一化路径符合修复目标,现有调用链中也未发现被破坏的对象、编码或上传契约。

Important Files Changed

Filename Overview
dependency-patches/expo-image-manipulator@57.0.14.patch 将 iOS 图片方向归一化从手工 CGContext 变换改为正常方向直返、其他方向通过系统 renderer 绘制。
package.json 在根 pnpm 配置中登记 expo-image-manipulator@57.0.14 补丁。
pnpm-lock.yaml 为 Mobile importer、依赖快照和 patchedDependencies 同步补丁哈希。
dependency-patches/README.md 记录补丁解决的问题、实现策略、参考来源及后续移除条件。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[iOS UIImage] --> B{imageOrientation == .up?}
  B -- 是 --> C[复用原 UIImage]
  B -- 否 --> D[UIGraphicsImageRenderer 新画布]
  D --> E[UIImage.draw 应用方向]
  C --> F[Expo 保存与上传流程]
  E --> F
Loading

Reviews (1): Last reviewed commit: "fix(mobile): 同步 iOS HDR 补丁哈希" | Re-trigger Greptile

@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已确认 cindy/silent-leakey 分支,并在本地无冲突 rebase 到 main 63e9072

变更:

  • 两条原有提交 rebase 为 f798c3698、6e12aa3d9;git range-diff 确认补丁内容完全一致,未新增业务改动。

验证:

  • pnpm install --frozen-lockfile、Mobile typecheck、test:scope、DCO 均通过;安装后的 expo-image-manipulator 57.0.14 已应用 Swift 补丁,补丁哈希与 lockfile 一致。
  • pnpm test:unit:related 按根依赖变更选择全量:Mobile 和全部要求的共享包通过;Desktop 首轮发生 ERR_IPC_CHANNEL_CLOSED。
  • Desktop 通过仓库 runner 单独完整复测:2421 个测试文件通过,2 个失败;32736 项通过,8 项失败,94 项原有跳过。失败位于 blobStore.test.ts 和 ingest.test.ts,涉及 Windows 创建 symlink 时的 EPERM,以及后续 ENOENT。这些文件及实现与 main 完全一致。
  • git diff --check(工作区)通过;相对 main 的检查仅提示既有 patch 第 71 行的上下文空格,此空格属于补丁格式,保持原样。

备注:

  • 本地验证未全过,因此未推送 rebase 结果,远端 head 仍为 362ae59。需在具备符号链接创建权限的 Windows 环境完成失败测试复验后再推送。没有合并 PR。

@MagicLizi

Copy link
Copy Markdown
Contributor

@DavidShenXD 👋 这个 PR 已经有 3 天没有 rebase 了。

为了避免合入后出现 CI 未曾验证过的新问题,请在本地 rebase 最新的 origin/main 后重新推送。rebase 后 CI 会自动重跑,全部通过后 auto-review 会在下一轮继续处理。

@DavidShenXD
DavidShenXD merged commit 50201fb into main Sep 7, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants