如何检测是否从键盘的容器应用程序激活自定义键盘?

das*_*ist 27 keyboard ios ios8

我想知道是否有一种方法可以让我从键盘容器应用程序检测相关键盘是否已在设备的设置应用程序中激活.

例如,我有兴趣在容器应用程序中添加一个简单的"步骤"功能,其中步骤1将"激活键盘",而步骤2将取决于步骤1的完成.因此,我有兴趣弄清楚是否有办法检测键盘扩展是否被激活?

谢谢!

小智 51

这是我在我的一个项目中使用的方法.我想这就是你要求的,希望它对你有所帮助.

- (BOOL)isCustomKeyboardEnabled {
    NSString *bundleID = @"com.company.app.customkeyboard"; // Replace this string with your custom keyboard's bundle ID
    NSArray *keyboards = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] objectForKey:@"AppleKeyboards"]; // Array of all active keyboards
    for (NSString *keyboard in keyboards) {
        if ([keyboard isEqualToString:bundleID])
            return YES;
    }

    return NO;
}
Run Code Online (Sandbox Code Playgroud)

  • 这超级有用!但是,如果安装了键盘,这将更有用.这不会告诉屏幕上哪个键盘当前处于活动状态?还是我错过了什么? (4认同)
  • 很棒,这就完成了工作!伟大的发现. (2认同)

Val*_*gin 8

以防万一这里是Swift版本的Kurt的精彩和令人敬畏的答案:

   func isKeyboardExtensionEnabled() -> Bool {
    guard let appBundleIdentifier = Bundle.main.bundleIdentifier else {
        fatalError("isKeyboardExtensionEnabled(): Cannot retrieve bundle identifier.")
    }

    guard let keyboards = UserDefaults.standard.dictionaryRepresentation()["AppleKeyboards"] as? [String] else {
        // There is no key `AppleKeyboards` in NSUserDefaults. That happens sometimes.
        return false
    }

    let keyboardExtensionBundleIdentifierPrefix = appBundleIdentifier + "."
    for keyboard in keyboards {
        if keyboard.hasPrefix(keyboardExtensionBundleIdentifierPrefix) {
            return true
        }
    }

    return false
}
Run Code Online (Sandbox Code Playgroud)