iOS点击键盘上方密钥按钮触发自动填充时随机崩溃问题
iOS 16下Autofill密码视图控制器重复模态展示崩溃问题
错误信息
应用因未捕获异常
NSInvalidArgumentException终止,原因:'应用尝试以模态方式展示已由<UIKeyboardHiddenViewController_Autofill: 0x106e25a10>展示的视图控制器<_SFAppAutoFillPasswordViewController: 0x106e22ee0>。'
环境
- 系统版本:iOS 16(暂未确认其他版本是否可复现)
复现步骤
- 点击文本框调出带有密钥按钮的系统键盘
- 点击密钥按钮后,应用随机发生崩溃
解决方案
1. 禁止手动干预系统Autofill控制器
_SFAppAutoFillPasswordViewController由iOS系统Autofill框架自动管理,代码中禁止手动触发该控制器的模态展示操作,否则会与系统原生展示流程冲突。
2. 校验文本框Autofill配置
确保文本框的textContentType属性与业务场景匹配:
// 用户名输入框配置 usernameTextField.textContentType = UITextContentTypeUsername; // 密码输入框配置 passwordTextField.textContentType = UITextContentTypePassword;
错误的类型配置可能导致系统Autofill流程异常,触发重复展示逻辑。
3. 添加异常捕获防护
在涉及文本框交互或模态跳转的代码块外添加异常捕获,避免应用直接崩溃:
@try { // 处理文本框交互或模态跳转的业务逻辑 } @catch (NSException *exception) { if ([exception.name isEqualToString:NSInvalidArgumentException] && [exception.reason containsString:@"Autofill"]) { NSLog(@"Autofill模态展示冲突:%@", exception.reason); // 可添加友好提示逻辑 } }
4. iOS 16针对性适配
在触发键盘相关操作前,检查当前控制器的presentedViewController是否为Autofill相关控制器,避免重复发起展示请求:
if (@available(iOS 16.0, *)) { UIViewController *presentedVC = self.presentedViewController; NSString *vcDesc = presentedVC.class.description; if (presentedVC && ([vcDesc containsString:@"UIKeyboardHiddenViewController_Autofill"] || [vcDesc containsString:@"_SFAppAutoFillPasswordViewController"])) { return; } }
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

