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

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

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

谢谢!

这是我在其中一个项目中使用的方法。 我想这是你要求的,希望它能帮助你。

- (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; } 

以防万一这里是Kurt的辉煌和真棒答案的Swift版本:

 public func isKeyboardExtensionEnabled() -> Bool { guard let appBundleIdentifier = NSBundle.mainBundle().bundleIdentifier else { fatalError("isKeyboardExtensionEnabled(): Cannot retrieve bundle identifier.") } guard let keyboards = NSUserDefaults.standardUserDefaults().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 } 

当前文档状态By default, your extension and its containing app have no direct access to each other's containers

这也是说,容器应用程序可以用以下方式与键盘共享数据:

 // Create and share access to an NSUserDefaults object. NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.example.domain.MyShareExtension"]; // Use the shared user defaults object to update the user's account. [mySharedDefaults setObject:theAccountName forKey:@"lastAccountName"]; 

阅读更多信息: 使用应用程序组在应用程序之间传递和保持数据

障碍没有1 :根据文档,为了这个工作,plist中的RequestsOpenAccess需要设置为YES因为它会获得以下function:

select与包含键盘的应用程序一起使用共享容器,从而实现诸如在包含应用程序中提供自定义词典pipe理UI

要求完全访问这样一个简单的情况绝对不是我的偏好。

障碍2 :使用这个设置NSUserDefault知识,让我想到一个方法,可以在这个地方设置。 但是没有公开的方法表明安装了扩展。 所以现在这是一个死路一条。

[更新1]

不是超级相关,但仍然值得一提: shouldAllowExtensionPointIdentifier应用程序委托方法与常量UIApplicationKeyboardExtensionPointIdentifier组合可以处理禁止自定义键盘。 扩展点标识符不是扩展名的唯一标识符,而是其types。

阅读更多: 我可以禁用自定义键盘(iOS8)为我的应用程序?

[更新2]

另一个同样的问题,但没有解决scheme的问题: 如何检测应用程序扩展是启用在iOS 8上的应用程序包含?

这是一个正在进行的工作,说明我目前为止的发现,希望在未来几天内能find解决办法。