我可以为我的应用禁用自定义键盘 (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) 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查我的ios8自定义键盘扩展是否具有开放访问权限?

在包含应用程序和自定义键盘的 iOS8 之间共享图像

如何检查我的 ios8 自定义键盘扩展是不是具有开放访问权限?

设备上的 iOS 8 自定义键盘

以编程方式为我的应用禁用键盘

自定义键盘应用程序扩展 iOS 8 上的 Siri