Skip to content

Latest commit

 

History

History
34 lines (27 loc) · 5.91 KB

File metadata and controls

34 lines (27 loc) · 5.91 KB

Current Task — IMProgram(iOS)

活快照:只记当前状态,就地覆盖、不追加。逐功能×端状态以 ../IMServer/docs/CLIENT_PARITY.md 为唯一来源; 历史流水见 current_task.archive.md + git log。关键约定见 CLAUDE.md / ARCHITECTURE.md / CODING_STYLE.md

当前焦点

IMChatViewController 巨类拆分 + /code-review 全修 ✅ 代码完成(2026-08-15~18,clean build 绿,待手测,纯 iOS 端)

  • 4718 行 Massive VC 按《整洁代码》拆分:真·SRP 抽独立对象/纯函数(IMChatMessageLogicIMPasteImageTextFieldIMPendingMediaThumbnailIMChatBannerStack 三横幅栈+delegate);其余强耦合子系统(全回耦 messages/tableView/nav/socket)按分文件 category 平移到多 TU:+Selection/+Menu/+DataSource/+Media/+MediaFlow/+Mention/+Socket/+Scroll/+Compose。私有属性/协议/跨 TU 私有方法登记在 IMChatViewController+Private.h。主文件 4718→约 1470 行,未改一行行为,逐 commit build 绿。
  • /code-review(high,8 finder)8 项全修:① sendTapped 核心发送路径从 +Mention 挪到 +Compose;② IMChatBannerStack delegate 收进 init 参数(杜绝首帧 inset 回调因 delegate 未绑定被吞的顺序坑);③ IMReplySnippet 移到 IMMediaUtil(与 IMRecordItemPreview/IMLocalizeReplySnippet 同族);④⑤ 本地待发缩略图收口到 IMVideoThumbnailLoader/IMImageLoader 共享抽帧/降采样口径(消除 600↔720、options 分叉);⑥ 删 3 处 IMLooksLikeURL 宏拷贝、直接调 IMMediaLooksLikeURL;⑦ +Private.h 分组注释改按业务概念、不再标注定义文件(防搬家失真);⑧ 本快照就地覆盖。审查结论:无正确性回归(跨 TU 无重复方法定义、通知/定时器/socket delegate 拆除配平、横幅重写行为等价)。
  • 待手测:编译只保证符号,布局/交互需模拟器实测——键盘顶起输入栏、附件面板、长按菜单光栅化预览、多选态、↓N 跳转、@内联面板、三横幅顶开 tableView。

相机/粘贴单图收端缺 thumb 磨砂占位 ✅(2026-08-18,clean build 绿,待手测) — 相机/粘贴单图路径直接 uploadData→sendMedia,绕过 IMMediaSendServiceIMTinyThumbDataURI,socket payload 无 thumb。已把生成器导出为共享函数,在 mediaAttributesForImage:bytes: 统一写 attrs.thumb(相机+粘贴同覆盖),并回填本地 m.thumb(修转发自拍/粘贴图丢磨砂);IMMediaPlaceholderTests 补 data URI 解码 / 20px 尺寸 / 协议长度上限。单测/手测未跑。

下一步

  1. 手测(优先):拆分后聊天页全交互回归(见上「待手测」清单)+ 相机/粘贴单图收端磨砂占位 + 转发自拍图有磨砂。
  2. 无问题 → 接下一里程碑(后端排队 语音消息 P0 → 收藏改造,见 ../IMServer/current_task.mddocs/ROADMAP.md)。

已知坑 / 限制

  • runAfterKeyboardHidden: 兜底待测(2026-08-05 记):依赖 resignFirstResponder 后必然收到 UIKeyboardDidHideNotification——软键盘正常成立;若实测硬件/外接键盘场景引用跳转不触发,加 dispatch_after 超时兜底。
  • 相册导出期杀 App 消息消失(PHPicker 句柄一次性,属预期,微信同);导出失败的行点 ↻ 提示副本丢失需重选。Files 面板 <8MB 小文件、相机拍摄、粘贴图仍为 VC 锚定一次性上传(秒级;粘贴图已带预览条攒批)。
  • iOS 无双向分页(进会话全量载入本地 DB);presence/typing 仅聊天页标题生效。dev-login 建的账号无法再走密码登录(测密码登录用「注册并登录」或清 imserver.db)。
  • 查看器"正在播放中"视频 404 未接失效占位(2026-08-11 记)IMMediaViewerViewControlleritem.status KVO 但失败一律走「无法播放该视频」兜底,未把 404/410 翻 ⊘。窄路径(气泡/媒体库通常先探到→进查看器即短路),兜底不黑屏故可接受。补法:失败分支走 IMMediaExpiryRegistry verifyExpiredForURL: 定性→失效覆盖层 + mid-play teardown。
  • 失效标记内存态不持久(刻意,2026-08-11 记)IMMediaExpiryRegistry 用进程内 Set,冷启动首帧重探一次换自愈;仅当服务端上自动 TTL 清理使失效变常态才上持久化。
  • 系统按钮文案本地化(2026-08-12 修,未编译验证)Info.plistCFBundleLocalizations=[zh-Hans,en] 让 QLPreview「Done」/UISearchBar「Cancel」等系统文案落中文;自有 UI 硬编码中文,将来做真·多语言再建 .lproj
  • 原图路径 JPEG 字节戴 .heic 帽子(2026-08-12 记,暂不改)IMMediaPicker buildImageItem 原图分支按 UTTypeImage 取字节(iOS 可能把 HEIC 转 JPEG 交付)但扩展名靠 hasItemConformingToTypeIdentifier:UTTypeHEIC 猜 → JPEG 内容 + .heic 名错配。Web 靠字节嗅探已能各自正确显示故非阻塞;计划换第三方相册选择器(任务4)后此坑自消。
  • 测试只跑 -only-testing:IMProgramTests;改后端协议后需重启后端再测。

关联工程 / 常用命令

  • 后端 /Users/liying/IOSProject/IMServer;Web /Users/liying/IOSProject/im-web
  • 构建:xcodebuild -workspace IMProgram.xcworkspace -scheme IMProgram -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' build CODE_SIGNING_ALLOWED=NO
  • 测试编译 + 实跑:xcodebuild build-for-testing ... → 有 booted 模拟器则 test-without-building ... -only-testing:IMProgramTests
  • 真机日志:xcrun devicectl device copy from --device iPhoneWork --domain-type appDataContainer --domain-identifier com.libeyond.IMProgram --source "Library/Caches/Logs/<file>.log" --destination <dst>(list 用 device info files;崩溃报告 --domain-type systemCrashLogs)。
  • 完成定义 / 编码规范:见 CLAUDE.mdCODING_STYLE.md