Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

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

Aperta Adatta ai principianti
#496 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
78/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
ios, objective-c
Ambito
mobile-dev

Direzione di ricerca

Inizia da iOS/Source/UI/Common/TUIGradientView.h e cerca nel pod Objective-C i riferimenti a TUIGradientView e TUIGradientViewDirection. Verifica il pod TUICalling interessato, vendored o rilasciato, e confronta i suoi nomi di classe con TextInputUI.framework come descritto. Il lavoro è completato quando la classe in conflitto è stata rinominata in modo coerente senza modificare il comportamento pubblico né l'enum.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

问题概述

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.4(tencentyun/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
Lingua principale
Swift
Stelle
251
Fork
170
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di Tencent-RTC/TUICallKit

Tutte le issue di Tencent-RTC/TUICallKit

Issue simili

Altre issue su Swift

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.