Skip to content

[iOS] TUIGradientView 与系统私有框架 TextInputUI.framework 类名冲突,导致英文键盘卡死闪退 #496

Description

@jschyz

问题概述

ObjC 版 TUICalling pod 里的 TUIGradientView,与 Apple 私有框架 TextInputUI.framework(系统键盘的 UI 框架,TUI = Text Input UI)中的一个类同名

ObjC 运行时同名类只会保留一个,App 静态链接的 TUICalling 版本覆盖了系统那个。系统键盘随后向它认为是自己的类发消息,直接崩溃:

-[TUIGradientView setLightConfiguration:]: unrecognized selector sent to instance

现象

任何链接了 TUICalling 的 App 都会中招,不需要用到音视频通话功能,只要 pod 被链接进去就会触发

  • 使用英文键盘时,输入即卡死,键盘无法收起,随后闪退。
  • 中文拼音键盘不受影响,它不走这条渲染路径。

已在 iPhone 13 Pro 和 iPhone 17 Pro 真机复现;两台设备在重命名该类后都恢复正常。

证据

Apple 的框架确实声明了同名类,也确实使用该选择子(在 iOS 26.3 / 26.4 / 26.5 三个模拟器 runtime 上验证):

$ nm -a .../PrivateFrameworks/TextInputUI.framework/TextInputUI | grep TUIGradientView
0000000000153870 S _OBJC_CLASS_$_TUIGradientView
0000000000153848 S _OBJC_METACLASS_$_TUIGradientView

$ strings -a .../PrivateFrameworks/TextInputUI.framework/TextInputUI | grep -x setLightConfiguration:
setLightConfiguration:

TUICalling 一侧 —— iOS/Source/UI/Common/TUIGradientView.h

@interface TUIGradientView : UIView

影响版本

已发布的 TUICalling pod 中一直存在,包括最新的 9.6.4tencentyun/TUICalling,tag v9.6.4)。

需要说明的是:本仓库 main 分支已经重构为 TUICallKit_Swift,其中并无此类,所以直接看主干会以为问题不存在。受影响的是 CocoaPods 目前仍在分发的旧版 Objective-C pod,而不是当前的 Swift 代码库。

修复建议

把类名改成带命名空间前缀的形式,例如 TUICallingGradientView

在我们 vendored 的 9.5.1 源码中,该类在 pod 内部没有任何其他引用,因此改名是自包含的、不会波及调用方。TUIGradientViewDirection 是普通枚举,不参与运行时注册,可以保持不变。

我们目前是在自己的 Podfile 里用 post_install 打补丁绕过。

建议顺带自查整个 TUI* 命名面

TextInputUI.framework 注册了约 322 个类。由于两边都在用 TUI 前缀,建议不要只改这一个类,而是把整个命名面交叉比对一遍。我们就是这样确认了 TUIGradientView 是我们这侧唯一的冲突:

nm -a "<simruntime>/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/TextInputUI.framework/TextInputUI" \
  | grep -F '_OBJC_CLASS_$_' \
  | sed 's/.*_OBJC_CLASS_\$_//' \
  | sort -u

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions