iOS 目前已答应运用第三方输入法,但在实际开发中,无论是出于安全的考虑,仍是对某个输入控件约束输入法,都有禁用第三方输入法的需求。基于此,对禁用第三方输入法的方法做一个总结。
1. 大局禁用
Objective-C 语言版别:
- (BOOL)application:(UIApplication *)application
shouldAllowExtensionPointIdentifier:(UIApplicationExtensionPointIdentifier)extensionPointIdentifier
{
// 禁用三方输入法
// UIApplicationKeyboardExtensionPointIdentifier 等价于 @"com.apple.keyboard-service"
if ([extensionPointIdentifier isEqualToString:UIApplicationKeyboardExtensionPointIdentifier]) {
return NO;
}
return YES;
}
Swift 语言版别:
func application(
_ application: UIApplication,
shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier
) -> Bool {
// 禁用三方输入法
if extensionPointIdentifier == .keyboard {
return false
}
return true
}
2. 针对某个视图禁用
func application(
_ application: UIApplication,
shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier
) -> Bool {
// 遍历当时根控制器的一切子控制器,找到需求的子控制器
for vc in self.window?.rootViewController?.childViewControllers ?? []
where vc.isKind(of: BaseNavigationController.self)
{
// 假如主页禁止运用第三方输入法
for vc1 in vc.childViewControllers where vc1.isKind(of: HomeViewController.self) {
return false
}
}
return true
}
3. 针对某个 inputView 禁用
3.1 自定义键盘
假如需求只是针对数字的输入,优先运用自定义键盘,将 inputView 绑定自定义键盘,不会出现第三方输入法。
3.2 遍历视图内控件,找到需求设置的 inputView,专门设置
func application(
_ application: UIApplication,
shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier
) -> Bool {
// 遍历当时根控制器的一切子控制器,找到需求的子控制器
for vc in self.window?.rootViewController?.childViewControllers ?? []
where vc.isKind(of: BaseNavigationController.self)
{
// 假如想要禁用的 inputView 在主页上
for vc1 in vc.childViewControllers where vc1.isKind(of: HomeViewController.self) {
// 假如 inputView.tag == 6 的 inputView 禁止运用第三方输入法
for view in vc1.view.subviews where view.tag == 6 {
return false
}
}
}
return true
}