我可以为我的应用禁用自定义键盘(iOS8)吗?

我可以为我的应用禁用自定义键盘(iOS8)吗?,ios,ios8,Ios,Ios8,编辑:tl;dr-这是可能的,请参阅下面接受的答案。 是否有任何(不仅仅是编程)方法防止自定义键盘(iOS8)用于我的应用程序?我主要对“每个应用程序”设置感兴趣,所以我的应用程序不允许使用自定义键盘,但禁用自定义键盘是最后的选择 到目前为止,我知道定制键盘是全系统的,可以被任何应用程序使用。操作系统将回退到仅用于安全文本输入的普通键盘(文本字段secureTextEntry设置为YES)。这里没有多少希望 《应用程序扩展编程指南》给我的印象是,MDM(移动设备管理)完全可以限制设备使用自定义键

编辑:tl;dr-这是可能的,请参阅下面接受的答案。

是否有任何(不仅仅是编程)方法防止自定义键盘(iOS8)用于我的应用程序?我主要对“每个应用程序”设置感兴趣,所以我的应用程序不允许使用自定义键盘,但禁用自定义键盘是最后的选择

到目前为止,我知道定制键盘是全系统的,可以被任何应用程序使用。操作系统将回退到仅用于安全文本输入的普通键盘(文本字段
secureTextEntry
设置为
YES
)。这里没有多少希望

《应用程序扩展编程指南》给我的印象是,MDM(移动设备管理)完全可以限制设备使用自定义键盘,但我在针对OS X Yosemite的新版《Apple Configurator.App测试版中没有找到这个选项。“配置器”是否缺少该选项


有什么想法吗?我是否应该提交一份雷达文件,建议苹果公司引入此类功能?

看来你在beta seed 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;
}

我只想为那些希望在Xamarin iOS中实现此方法的开发人员添加此功能。其思想是覆盖
AppDelegate
中的
ShouldAllowExtensionPointIdentifier
方法:

public override bool ShouldAllowExtensionPointIdentifier(UIApplication application, NSString extensionPointIdentifier)
{
    if (extensionPointIdentifier == UIExtensionPointIdentifier.Keyboard) 
    {           
        return false;
    }
    return true;
}
Swift 3:

func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplicationExtensionPointIdentifier) -> Bool {
    if extensionPointIdentifier == UIApplicationExtensionPointIdentifier.keyboard {
        return false
    }
    return true
}

在Swift 5中,UIApplicationExtensionPointIdentifier更改为UIApplication.ExtensionPointIdentifier

func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier) -> Bool {
    if extensionPointIdentifier == UIApplication.ExtensionPointIdentifier.keyboard {
        return false
    }
    return true
}

如果用户想要使用自定义键盘,你是谁来阻止他们?@FilipRadelic:security reasons(企业应用程序)。@matm-AFAIK你不能这么做。自定义键盘在系统范围内“替换”系统键盘。从企业的角度来看,您唯一能做的就是a)禁止安装应用商店应用程序,或b)如果有人安装了包含自定义键盘的应用程序,则执行某些操作。但是a)很难在BYOD中实现,b)很难找到。。。苹果对雷达开放(可能是iOS9)。这是个好消息!今天我正要浏览API差异,我还有一个理由这么做:)谢谢分享@菲利普:谢谢你的回答。但我还有一个问题。我知道,我们将能够禁用自定义iOS8键盘使用上述代码片段。这里重要的一点是,我们需要使用Xcode-6/ios8sdk来使用上述功能。由于其他一些限制,我仍然使用Xcode 5。我有没有办法阻止第三方键盘使用iOS 7 SDK/Xcode 5?请帮助。@RashmiRanjanmallick理论上讲,在对旧SDK进行编译时,没有任何东西可以阻止您实现此方法。您只需替换
UIApplicationKeyboardExtensionPointIdentifier
常量,因为它在8.0SDK之前没有定义。您只需将其替换为
@“com.apple.keyboard service”
。但是,我不知道在iOS 8上使用旧SDK构建时,该方法是否真的会被调用,我也没有任何旧SDK可以尝试,所以请告诉我它是否适用于您。仅供参考——这在iOS 7 SDK中确实有效。(测试)事实上。。。它甚至可以在iOS6SDK中工作。(测试)当我尝试上面的代码时,它工作了。但当我添加一些if条件时,它返回NO并仍然显示第三方键盘。有人能帮忙吗?