我想知道是否有一种方法可以让我从键盘容器应用中检测 是否已在设备的“设置”应用中激活相关键盘。
例如,我有兴趣在容器应用程序中添加一个简单的“步骤”功能,其中步骤1将“激活键盘”,而步骤2将取决于步骤1的完成。因此,我有兴趣弄清楚是否有办法检测键盘扩展是否已激活?
谢谢!
答案 0 :(得分: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;
}
答案 1 :(得分:7)
以防万一这是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
}
答案 2 :(得分:2)
当前documentation个州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"];
详细了解:Communicating and persisting data between apps with App Groups
障碍1号:根据文档,为了实现此目的,需要将plist中的RequestsOpenAccess
设置为YES
,因为它将获得以下功能:
使用包含应用程序的键盘的共享容器的选项, 它提供了诸如提供自定义词典管理等功能 包含应用程序中的UI
请求完全访问这样的简单案例绝对不是我的首选。
障碍2号:使用设置NSUserDefault
的知识,让我想到一个可以设置的方法。但是没有公开的方法表明安装了扩展。所以现在这是一个死胡同。
-
[更新1]
不是超级相关但仍然值得说明:shouldAllowExtensionPointIdentifier
app委托方法与常量UIApplicationKeyboardExtensionPointIdentifier
结合使用可以处理不允许自定义键盘。扩展点标识符不是扩展名的唯一标识符,而是其类型的唯一标识符。
详细了解:Can I disable custom keyboards (iOS8) for my app?
-
[更新2]
另一个问题有同样的问题,但没有解决方案:How to detect an app extension is enabled in containing app on iOS 8?
-
这是一份正在进行中的答案,说明我迄今为止的调查结果,如果我找到解决方案,我希望在未来几天内进行更新。
答案 3 :(得分:0)
您可以使用此功能(Swift 3和4)检查您的自定义键盘扩展程序是否具有开放访问权限:
func isOpenAccessGranted() -> Bool{
if #available(iOS 10.0, *) {
let originalString = UIPasteboard.general.string
UIPasteboard.general.string = "Sour LeangChhean"
if UIPasteboard.general.hasStrings {
UIPasteboard.general.string = originalString ?? ""
return true
}else{
UIPasteboard.general.string = ""
return false
}
} else {
// Fallback on earlier versions
if UIPasteboard.general.isKind(of: UIPasteboard.self) {
return true
}else{
return false
}
}
}