活快照:只记当前状态,就地覆盖、不追加。逐功能×端状态以
../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 抽独立对象/纯函数(
IMChatMessageLogic、IMPasteImageTextField、IMPendingMediaThumbnail、IMChatBannerStack三横幅栈+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;②IMChatBannerStackdelegate 收进 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,绕过 IMMediaSendService 的 IMTinyThumbDataURI,socket payload 无 thumb。已把生成器导出为共享函数,在 mediaAttributesForImage:bytes: 统一写 attrs.thumb(相机+粘贴同覆盖),并回填本地 m.thumb(修转发自拍/粘贴图丢磨砂);IMMediaPlaceholderTests 补 data URI 解码 / 20px 尺寸 / 协议长度上限。单测/手测未跑。
- 手测(优先):拆分后聊天页全交互回归(见上「待手测」清单)+ 相机/粘贴单图收端磨砂占位 + 转发自拍图有磨砂。
- 无问题 → 接下一里程碑(后端排队 语音消息 P0 → 收藏改造,见
../IMServer/current_task.md与docs/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 记):
IMMediaViewerViewController有item.statusKVO 但失败一律走「无法播放该视频」兜底,未把 404/410 翻 ⊘。窄路径(气泡/媒体库通常先探到→进查看器即短路),兜底不黑屏故可接受。补法:失败分支走IMMediaExpiryRegistry verifyExpiredForURL:定性→失效覆盖层 + mid-play teardown。 - 失效标记内存态不持久(刻意,2026-08-11 记):
IMMediaExpiryRegistry用进程内 Set,冷启动首帧重探一次换自愈;仅当服务端上自动 TTL 清理使失效变常态才上持久化。 - 系统按钮文案本地化(2026-08-12 修,未编译验证):
Info.plist补CFBundleLocalizations=[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.md、CODING_STYLE.md。