iOS15.0.2下编辑UITextField抛出NSInvalidArgumentException是什么原因?
问题原因
这是iOS 15.0~iOS 15.1版本的官方系统Bug,出现在系统默认键盘的文本预处理逻辑中:系统内部处理输入文本时,错误将NSArray类型的变量当作NSString调用stringByTrimmingCharactersInSet:方法,触发无法识别选择器的崩溃。
该问题与业务代码、textField配置无关,以下特征均可佐证:
- 崩溃覆盖所有textField组件,包括未做任何自定义的FirebaseUI内置textField
- 崩溃堆栈中存在大量UIKit键盘相关的系统调用,未关联到业务代码逻辑
- 升级iOS 15.2后问题自动消失,匹配苹果在该版本更新中修复的文本输入类系统Bug的官方记录
兼容方案(如需支持iOS 15.0~15.1版本)
如果App需要兼容上述存在问题的系统版本,可以采用以下临时方案规避崩溃:
- 添加
NSArray分类,实现空的stringByTrimmingCharactersInSet:方法兜底,避免异常抛出,示例代码如下:
// 可直接在项目中添加该分类,无需额外调用 @implementation NSArray (CrashFix) - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set { // 兜底逻辑,可根据需要返回空字符串或者其他默认值 return @""; } @end
如果使用Swift开发,可以通过Runtime方式添加方法实现,或者使用全局异常捕获处理该类异常。
2. 针对iOS 15.0~15.1版本,可临时关闭textField的自动纠错、自动首字母大写等系统文本预处理功能,绕过触发Bug的逻辑:
textField.autocorrectionType = .no textField.autocapitalizationType = .none
- 优先引导用户升级到iOS 15.2及以上版本,从根源上解决该问题。
其他无关问题说明
- 日志中的
Writing analzed variants.是Xcode调试时的系统日志,确实不影响业务逻辑,可以忽略 - 启动时的网络相关日志是iOS 15早期版本的网络框架调试日志,和本次文本输入崩溃无关联
内容的提问来源于stack exchange,提问作者Dan Abnormal
相关产品推荐
相关产品推荐

