我可以为我的应用禁用自定义键盘 (iOS8) 吗?
Posted
技术标签:
【中文标题】我可以为我的应用禁用自定义键盘 (iOS8) 吗?【英文标题】:Can I disable custom keyboards (iOS8) for my app? 【发布时间】:2014-07-03 15:09:27 【问题描述】:编辑:tl;dr - 有可能,请参阅下面接受的答案。
是否有任何(不仅是程序化的)方法可以防止自定义键盘 (ios8) 用于我的应用程序?我主要对“每个应用程序”设置感兴趣,所以我的应用程序不允许使用自定义键盘,但在系统范围内禁用自定义键盘是最后的手段。
到目前为止,我知道自定义键盘是系统范围的,可以被任何应用程序使用。操作系统将仅针对安全文本输入(secureTextEntry
设置为 YES
的文本字段)回退到备用键盘。这里希望不大。
App Extension Programming Guide
给我的印象是 MDM(移动设备管理)可以完全限制设备使用自定义键盘,但我在 OS X Yosemite 的 Apple Configurator.app
的新 beta 版中没有找到该选项。 “配置器”只是缺少该选项吗?
这里有什么想法吗?我应该提交雷达建议 Apple 应该引入此类功能吗?
【问题讨论】:
如果用户想使用自定义键盘,你是谁来阻止他们? @FilipRadelic:安全原因(企业应用)。 @matm - AFAIK 你不能那样做。自定义键盘“替换”系统范围内的系统键盘。从企业的角度来看,您唯一可以做的事情是 a) 禁止安装 App Store 应用程序或 b) 如果有人安装了包含自定义键盘的应用程序,则执行一些操作。但是 a) 很难在 BYOD 中实现,b) 很难找到……Apple 对雷达持开放态度(可能适用于 iOS9)。 【参考方案1】:看起来你在 beta 种子 3 中得到了你想要的东西。UIApplication.h 的第 440 行:
// Applications may reject specific types of extensions based on the extension point identifier.
// Constants representing common extension point identifiers are provided further down.
// If unimplemented, the default behavior is to allow the extension point identifier.
- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier NS_AVAILABLE_IOS(8_0);
它目前未包含在文档中,但听起来它会完全按照您在此处的要求进行。
我猜这些“扩展点标识符”不是扩展的唯一标识符,而是它们的类型,因为第 545 行也有这个:
// Extension point identifier constants
UIKIT_EXTERN NSString *const UIApplicationKeyboardExtensionPointIdentifier NS_AVAILABLE_IOS(8_0);
TLDR:要禁用自定义键盘,您可以在您的应用委托中包含以下内容:
- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier
if ([extensionPointIdentifier isEqualToString: UIApplicationKeyboardExtensionPointIdentifier])
return NO;
return YES;
【讨论】:
这是个好消息!我今天正要检查 API 差异,还有一个理由这样做:) 感谢分享! @Filip:感谢您的回答。但我还有另一个问题。我知道我们将能够使用上面的代码 sn-p 禁用自定义 iOS 8 键盘。这里重要的一点是我们需要使用Xcode-6/iOS 8 SDK来使用上面的。由于其他一些限制,我仍在使用 Xcode 5。有什么办法可以防止使用 iOS 7 SDK/Xcode 5 的第三方键盘?请帮忙。 @RashmiRanjanmallick 从理论上讲,在针对旧版 SDK 进行编译时,没有什么能阻止您实现此方法。您只需替换UIApplicationKeyboardExtensionPointIdentifier
常量,因为它在 8.0 SDK 之前没有定义。您可以将其替换为@"com.apple.keyboard-service"
。但是,我不知道当针对旧 SDK 构建时,该方法是否真的会在 iOS 8 上被调用,而且我没有任何旧 SDK 可以尝试,所以请告诉我它是否适合您。
仅供参考——这确实适用于 iOS 7 SDK。 (经过测试)事实上......它甚至可以在 iOS 6 SDK 中使用。 (经过测试)
当我尝试上面的代码时,它起作用了。但是当我添加一些 if 条件时,它返回 NO 并且仍然显示 3rd 方键盘。有人可以帮忙吗?【参考方案2】:
斯威夫特 3:
func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplicationExtensionPointIdentifier) -> Bool
if extensionPointIdentifier == UIApplicationExtensionPointIdentifier.keyboard
return false
return true
【讨论】:
【参考方案3】:我只是想为那些想要在 Xamarin iOS 中实现此方法的开发人员添加这个。我们的想法是覆盖AppDelegate
中的ShouldAllowExtensionPointIdentifier
方法:
public override bool ShouldAllowExtensionPointIdentifier(UIApplication application, NSString extensionPointIdentifier)
if (extensionPointIdentifier == UIExtensionPointIdentifier.Keyboard)
return false;
return true;
【讨论】:
【参考方案4】:在 Swift 5 中,UIApplicationExtensionPointIdentifier 更改为 UIApplication.ExtensionPointIdentifier。
func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier) -> Bool
if extensionPointIdentifier == UIApplication.ExtensionPointIdentifier.keyboard
return false
return true
【讨论】:
【参考方案5】:在 Swift 5 中使用开关:
func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier) -> Bool
switch extensionPointIdentifier
case .keyboard:
return false
default:
return true
【讨论】:
以上是关于我可以为我的应用禁用自定义键盘 (iOS8) 吗?的主要内容,如果未能解决你的问题,请参考以下文章