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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检测是否从键盘的容器应用程序激活自定义键盘?相关的知识,希望对你有一定的参考价值。

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

例如,我有兴趣在容器应用程序中添加一个简单的“步骤”功能,其中步骤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;
}
另一答案

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

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
}
另一答案

目前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应用程序委托方法与常量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?

--

这是一个正在进行中的答案,说明我迄今为止的调查结果,如果我找到解决方案,我希望在未来几天更新。

另一答案

您可以使用此功能(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
       }
   }
}

以上是关于如何检测是否从键盘的容器应用程序激活自定义键盘?的主要内容,如果未能解决你的问题,请参考以下文章

检测是不是已安装自定义键盘

在自定义键盘扩展中检测输入对象视图类型

自定义 iOS 键盘在没有完全访问权限的情况下访问容器

如何在 iOS 中使用文件 xib 自定义键盘

如何自定义键盘的功能

如何从自定义键盘扩展启动包含应用程序?