首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测自定义键盘是否在键盘的容器app中开通?

如何检测自定义键盘是否在键盘的容器app中开通?
EN

Stack Overflow用户
提问于 2014-09-05 05:58:50
回答 4查看 5.1K关注 0票数 32

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

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

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-11 20:00:30

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

代码语言:javascript
复制
- (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;
}
票数 58
EN

Stack Overflow用户

发布于 2016-05-17 05:36:15

为了以防万一,这里是库尔特精彩而令人惊叹的答案的Swift版本:

代码语言:javascript
复制
   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
}
票数 13
EN

Stack Overflow用户

发布于 2014-09-08 04:09:31

当前的documentation显示为By default, your extension and its containing app have no direct access to each other’s containers

它还声明容器应用程序可以通过以下方式与键盘共享数据:

代码语言:javascript
复制
// 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,因为它将获得以下功能:

选项,将共享容器与键盘的包含应用程序一起使用,这将启用一些功能,如在包含应用程序中提供自定义词典管理UI

对于像这样的简单案例,请求完全访问权限肯定不是我所希望的。

障碍物2号:使用这种设置NSUserDefault的知识,让我想到了一种方法,可以在适当的地方设置它。但是没有公共的方法来表明安装了一个扩展。所以现在这是一条死胡同。

--

更新1

不太相关,但仍然值得一提:结合常量UIApplicationKeyboardExtensionPointIdentifiershouldAllowExtensionPointIdentifier应用程序委托方法可以处理不允许自定义键盘的问题。扩展点标识符不是扩展的唯一标识符,而是其类型的唯一标识符。

请阅读更多相关内容:Can I disable custom keyboards (iOS8) for my app?

--

更新2

另一个具有相同问题的问题,但没有解决方案:How to detect an app extension is enabled in containing app on iOS 8?

--

这是一个正在进行中的回答,陈述了我到目前为止的发现,如果我找到解决方案,我希望在未来几天内更新。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25675628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档