【问题标题】:How to detect whether custom keyboard is activated from the keyboard's container app?如何检测是否从键盘的容器应用程序激活了自定义键盘?
【发布时间】:2014-10-29 19:15:11
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • +1,我也有同样的问题。
  • 添加了赏金。希望能引起更多关注。

标签: ios keyboard ios8


【解决方案1】:

当前的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?

--

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

【讨论】:

  • 到目前为止写得很好@dandoen。如果您找到解决方案,请更新!
  • 感谢您的更新。 Kurt提供的访问[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] objectForKey:@"AppleKeyboards"]的解决方案似乎成功了:)
【解决方案2】:

这是我在一个项目中使用的一种方法。我认为这是您所要求的,希望对您有所帮助。

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

【讨论】:

  • 太棒了,这成功了!伟大的发现。
  • 完美运行!谢谢。
  • 这个超级有用!但这在安装键盘的情况下更有用。这不会告诉屏幕上当前哪个键盘处于活动状态?还是我错过了什么?
  • @CemKozinoglu 我看到您通过出色的斜线键盘的介绍演练成功地做到了这一点(恭喜顺便说一句)。您介意与我们分享您是如何做到这一点的吗?
  • 太棒了! ,下一步呢?我们如何在同一个容器应用程序中检查是否启用了完全访问权限? @stackoverflow.com/users/4030703/kurt
【解决方案3】:

以防万一这里是库尔特出色而出色的答案的 Swift 版本:

   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
}

【讨论】:

  • fatalError 用于在测试时故意使应用程序崩溃。测试代码后,可以将其替换为 return false 并将错误打印到控制台。即使用户没有添加键盘扩展,在应用程序使用多个扩展的情况下比较前缀也可能返回 true。所以它可以作为一个全名来比较。
  • 感谢您的宝贵反馈。对此,我真的非常感激。 (1) 是的,当standardUserDefaults 没有AppleKeyboards 键时,代码发生了错误。我修复它。 (2) 我强烈反对fatalError 的目的,它与测试无关。 (3) 是的,代码假定捆绑包只有一个keyboard 扩展。
  • @ValentinShergin 您的回答很有帮助。但我不明白为什么我们检查捆绑标识符是否为零?我认为它不可能为零并且没有捆绑标识符应用程序不起作用。
  • 仅仅因为表达式 NSBundle.mainBundle().bundleIdentifier 至少在那个时候(那个 Swift 版本)返回一个 Optional(可以是 nil 的东西)。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多