react-native 0.63.4 iOS端输入时底部莫名弹出全屏空白页问题求助
问题根因
- 这是React Native 0.63.x 版本针对iOS 14及以上系统的已知兼容性缺陷,触发场景和
UITextView/UITextField的键盘相关系统弹窗逻辑有关:部分系统设置环境下,苹果会在用户输入时触发安全输入建议、自动填充验证码/密码的底层弹窗,RN 0.63.x的底层视图层级处理逻辑存在bug,会将这个底层弹窗的容器渲染成全屏白色层覆盖整个应用。 - 本地无法复现的核心原因是该触发逻辑和用户的系统设置强相关:包括是否开启自动填充密码、是否开启输入建议、iCloud钥匙串是否登录、系统语言/地区是否属于触发该弹窗的范围,只有满足对应设置的设备才会复现。
可落地解决方案
- 临时修复方案(无需升级RN版本):
在iOS原生层的AppDelegate.m中添加如下代码,全局禁用输入框的自动填充和输入建议附件视图:
如果只有登录/注册页的输入框触发问题,也可以只在对应页面的#import <React/RCTUITextField.h> #import <React/RCTUITextView.h> @implementation AppDelegate // 原有AppDelegate代码... + (void)load { // 全局禁用TextField的自动相关识别属性 [RCTUITextField appearance].autocorrectionType = UITextAutocorrectionTypeNo; [RCTUITextField appearance].autocapitalizationType = UITextAutocapitalizationTypeNone; [RCTUITextField appearance].spellCheckingType = UITextSpellCheckingTypeNo; // 全局禁用TextView的自动相关识别属性 [RCTUITextView appearance].autocorrectionType = UITextAutocorrectionTypeNo; [RCTUITextView appearance].autocapitalizationType = UITextAutocapitalizationTypeNone; [RCTUITextView appearance].spellCheckingType = UITextSpellCheckingTypeNo; } @endTextInput组件上添加属性:autoCorrect={false} autoCapitalize={'none'} spellCheck={false},同时明确指定textContentType属性(比如验证码输入框设为oneTimeCode,密码输入框设为password),不要使用默认的自动识别逻辑。 - 永久修复方案:
升级React Native版本到0.64.3及以上,该版本官方已经修复了iOS 14+输入相关的视图层级渲染bug。
复现验证方式
将测试设备的iCloud钥匙串开启,打开系统设置的「密码」-「自动填充密码」开关,同时将系统地区设置为美国/欧洲地区,语言设置为英文,即可在登录/注册输入框触发该问题,验证修复效果。
内容的提问来源于stack exchange,提问作者Angelica Rosa
相关产品推荐
相关产品推荐

