iOS 16+ 自定义键盘扩展中隐藏系统听写(麦克风)按钮的实现方案咨询
iOS 16+ 自定义键盘扩展中隐藏系统听写(麦克风)按钮的实现方案咨询
兄弟,我刚好在做自定义键盘的时候踩过这个iOS16的坑,当时那个系统强加的麦克风按钮真的很影响自定义键盘的布局和体验,现在把我试过的可行方法和踩过的坑跟你说下:
1. 官方推荐的Info.plist配置方案(首选)
这是苹果在iOS16之后专门为自定义键盘新增的官方控制项,完全合规,没有审核风险,也是最稳妥的解决办法:
- 打开你的键盘扩展目标的
Info.plist文件 - 找到
NSExtension字典,展开里面的NSExtensionAttributes子字典 - 新增一个键:
UIKeyboardSupportsDictation,设置类型为Boolean,值设为NO
添加完成后,记得彻底清理Xcode缓存(Command+Shift+Option+K),然后重启模拟器或真机再测试,有时候缓存会导致配置不生效。我自己就是用这个方法解决的,至今没出过问题。
2. 非官方的视图遍历隐藏方案(仅作备选,不推荐)
如果因为某些特殊情况官方配置不生效(比如个别iOS版本的小bug),可以试试这个临时的hack方法,但要注意风险很高:
- 核心思路是在
UIInputViewController的生命周期方法里,遍历键盘所在的系统视图层级,找到听写按钮的视图并隐藏它 - 这个方法依赖系统私有视图的类名,苹果后续系统更新可能会修改这个类名,而且审核时可能被判定为访问私有API,所以不到万不得已别用
代码示例(Objective-C)
- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if (@available(iOS 16.0, *)) { UIView *dictationButton = [self findDictationButtonInView:self.view.superview]; if (dictationButton) { dictationButton.hidden = YES; } } } - (UIView *)findDictationButtonInView:(UIView *)parentView { for (UIView *subview in parentView.subviews) { // 通过私有类名识别听写按钮视图 if ([NSStringFromClass(subview.class) isEqualToString:@"UIDictationInputView"]) { return subview; } UIView *foundView = [self findDictationButtonInView:subview]; if (foundView) { return foundView; } } return nil; }
代码示例(Swift)
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if #available(iOS 16.0, *) { if let dictationButton = findDictationButton(in: view.superview) { dictationButton.isHidden = true } } } private func findDictationButton(in parentView: UIView?) -> UIView? { guard let parentView = parentView else { return nil } for subview in parentView.subviews { if NSStringFromClass(subview.classForCoder) == "UIDictationInputView" { return subview } if let found = findDictationButton(in: subview) { return found } } return nil }
3. 额外注意事项
- 一定要在键盘扩展的Info.plist里添加配置,别加到主APP的Info.plist里,很多人一开始都会搞混
- 如果用官方配置后还是能看到按钮,检查下是否开启了系统的听写功能?不过亲测即使系统开了听写,只要配置了
UIKeyboardSupportsDictation为NO,按钮就不会显示 - 关于权限:不需要额外添加或移除任何权限,官方配置方案完全不需要修改权限设置
要是你试了官方方法还有问题,可以告诉我具体的场景,比如是特定机型还是特定iOS版本,我再帮你排查~




