报告概览
结论、范围与方法、章节地图和共性规律。
结论
本报告分析了 Telegram 官方 iOS 客户端和 macOS 客户端的源码,整理出两端在 UIKit 和 AppKit 上的非常规做法。15 份主题笔记共收录 300 条技巧,每条都附固定提交的源码行号。其中 88 条被选入报告正文(iOS 61 条,macOS 27 条),在站内标为“报告精选”。
iOS 客户端的技巧集中在三类。第一类绕开 UIKit 的布局与滚动栈:用 AsyncDisplayKit 节点、隐形 UIScrollView 和旋转 π 的列表自建界面。第二类直接操作系统私有对象:键盘窗口、_UIPortalView、_UILiquidLensView 和多个私有 KVC 键。第三类自管渲染管线:IOSurface 图集、Metal 三缓冲和共享 DisplayLink。
macOS 客户端的 TGUIKit 用 AppKit 复刻 UIKit 的习惯:统一翻转坐标,关闭隐式动画,自管 NSTableView 行高,用无键窗口自绘菜单。它的私有 API 集中在系统集成:CAEmitterBehavior 粒子行为、私有缩放光标、NSTitlebarView 重排、AVMovableView 深挖、Dock 图标资源叉和全局 CGEvent tap。
源码分析之后,我在 macOS 云电脑上用 REA 分析了官方 Telegram for macOS 13.0 的二进制,做补充验证。核对的 20 项中,16 项在发布版里有直接证据,2 项是版本差异。在 macOS 26.7 上,有 2 条私有路径已与系统结构不一致。iOS 二进制受 FairPlay 加密,没有验证。详情见 REA 二进制验证。
范围与方法
| 项目 | Telegram-iOS | TelegramSwift(macOS) |
|---|---|---|
| 仓库 | TelegramMessenger/Telegram-iOS | overtake/TelegramSwift |
| 分析提交 | f1dd7a2d(2026-10-07) | 579cebbf(2025-07-29,master 最新) |
| 源码规模 | 5,493 个 Swift 文件,913 个 ObjC/ObjC++ 文件 | 1,265 个 Swift 文件,88 个 ObjC 文件 |
| 主题笔记 | 01–11(11 份) | 12–15(4 份) |
| 二进制验证 | 未做(App Store IPA 加密) | 官方 13.0(build 283305) |
源码精读。 15 个子任务按主题并行读源码,其中第 09 主题(聊天界面)是单独补做的。每条技巧都写明“做了什么、为什么、怎么做到、风险”,并附源码行号。
合并精选。 我把 15 份主题笔记合并、去重,按技巧的独特性和可借鉴性精选出 88 条报告正文条目。
二进制验证。 我在 macOS 26.7 云电脑上用 REA 6.7.0 和 Rizin 0.9.1 分析发布版二进制,并在系统上实测私有类和 selector 是否仍存在。
章节地图
每个章节对应一份主题笔记。右侧数字是“条目数 · 精选数”。
iOS · UIKit
Telegram-iOS · 11 份主题笔记- 01运行时与私有 API方法交换、私有类名混淆、XOR 字节串与精确 ABI 调用。24 条 · 精选 6
- 02窗口、键盘与状态栏接管键盘窗口、修正键盘高度、伪造状态栏与窗口层级。22 条 · 精选 6
- 03布局与动画私有圆角、劫持系统弹簧、additive 动画与模型先到位。22 条 · 精选 6
- 04列表与滚动隐形 UIScrollView、π 旋转的倒序聊天与事务化布局。23 条 · 精选 6
- 05ASDK 与文本AsyncDisplayKit 异步绘制、自绘选择与 IME 修复。20 条 · 精选 5
- 06导航、手势与上下文菜单_UIPortalView 跨层显示、上下文菜单与手势仲裁。20 条 · 精选 5
- 07视觉特效与玻璃私有 Liquid Lens、CABackdropLayer 与可变模糊。20 条 · 精选 5
- 08渲染与性能IOSurface 图集、Metal 三缓冲与共享 DisplayLink。22 条 · 精选 4
- 09聊天界面输入框焦点交接、消息转场与列表到达判定。18 条 · 精选 8
- 10媒体、Stories 与个人页粒子行为、零拷贝视频纹理与个人页下拉画廊。15 条 · 精选 5
- 11非 UI 内核双重虚拟映射环形缓冲、共享 SQLite 保护与采样器。15 条 · 精选 5
macOS · AppKit
TelegramSwift · 4 份主题笔记共性规律
两个客户端都以显示层为真源。布局先写模型层,再让显式动画追赶屏幕。presentation() 与 additive 动画负责接力中断的动画。稳定身份与延迟销毁维持 diff 过渡。
iOS 借 UIScrollView 的物理和私有窗口拼装新栈。macOS 复刻 UIKit 习语,并显式管理 Core Animation 的生命周期。两端都用 Portal 思路复用像素。文本与贴纸都采用“占位几何加独立渲染”。
渲染依靠 IOSurface、像素池与按需提交。列表用旋转或翻转坐标保存锚点语义。算法与缓存通常不依赖私有 API。共享播放和解码上下文减少重复成本。
状态栏和键盘代理隔离了系统差异。复杂转场先镜像 Portal,再归还真实视图树。私有入口只在必要处使用,并尽量自检 ABI。
条目格式
章节页中的每条技巧都按同一结构组织。标题下方是元信息:条目编号、源码项目、框架、验证方式和标签,以及指向固定提交的源码链接。正文依次是“做了什么”“为什么这样做”“关键代码摘录”和“代价与风险”。最后的“证据链”汇总源码确认情况、报告摘要和二进制验证结果。
| 标记 | 含义 |
|---|---|
| 报告精选 | 该条进入报告正文,编号形如 01-1 |
| 源码分析 | 已在固定提交中逐行确认 |
| REA 二进制 | 在 13.0 发布版的 arm64 切片中找到字符串、导入或类表证据 |
| macOS 26.7 实测 | 用检查程序确认私有类、selector 或视图树是否仍存在 |
| REA 运行时观测 | 在 LLDB 下启动 13.0 副本 40 秒,记录断点调用 |
| 私有 API、运行时 hack | 依赖未公开接口或改写运行时行为,借鉴前先看风险页 |