【问题标题】:How to implement settings bundle for custom keyboard?如何实现自定义键盘的设置包?
【发布时间】:2014-09-27 01:37:50
【问题描述】:

我正在编写自己的自定义键盘。而且我不知道如何将我的设置包(在电话中设置)与我的键盘扩展连接,所以如果有人从电话设置中更改设置,然后打开一些文本字段来写一些我的键盘已经知道的内容,而不是他所做的更改设置。我尝试创建应用程序组以将我的应用程序与我的扩展程序连接起来,并在我的视图控制器中为NSUserDefaultsDidChangeNotification 添加观察者,例如:

var notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(self, selector: "settingsDidChange:", name: NSUserDefaultsDidChangeNotification, object: nil)

当有人对设置进行更改时,将调用 settingsDidChange: 方法,并且我正在设置我需要读取的所有内容到我的应用程序组中,以便从我的扩展程序中读取它。但是只有当人们打开我的应用程序时才会调用此方法,因此如果有人从手机设置更改设置并且不会打开应用程序,我的键盘将不会改变。那么如何为我的键盘实现我的设置包?

【问题讨论】:

  • 键盘扩展似乎有问题不听NSUserDefaultsDidChangeNotification。我有同样的问题。容器应用程序写入 userDefaults,键盘扩展正确读取它,但 NSNotificationCenterNSUserDefaultsaddObserver 都没有在这里工作。这对我们这里来说是一个严重的问题。
  • @bauerMusic 你有没有解决这个问题?
  • 不。但是,我想我可以不用(暂时),因为每当键盘再次出现时,它都会从更新的userDefaults 中读取。重读您的帖子,我相信您的问题是从 iPhone 的 设置写入userDefaults 没有生效?如果是这样,它与通知无关。我的问题是没有任何通知 KVO 起作用。 userDefaults 被写入,但没有一个听众被调用。阅读用户将代码从工作扩展(非键盘)复制/粘贴到键盘并且通知停止工作的类似投诉。
  • 对于仍在寻找解决方案的任何人:stackoverflow.com/questions/25121071/… 有一个要点示例,说明如何接收应用程序和扩展程序之间的 NSUserDefaults 更改的通知。关键是使用达尔文通知

标签: ios swift ios8 ios-app-extension custom-keyboard


【解决方案1】:

我还没有使用过键盘扩展,但是在 Today 和 WatchKit 扩展中遇到了类似的问题。 NSUserDefaultsDidChangeNotification 仅在进行更改的同一进程中发布。因此,iPhone 应用程序设置中的更改不会在扩展过程中向观察者触发该通知。

但是,Darwin 通知 (CFNotificationCenterGetDarwinNotifyCenter) 确实会发布到其他进程。

这是在 iPhone 应用程序中捕获 NSUserDefaultsDidChangeNotification 的要点,为扩展程序发布 Darwin 通知,在扩展程序中捕获它,最后将其转换为标准 NSNotification 以便于使用: https://gist.github.com/phatblat/f640416c15e11b685511

请注意,您不能在 Darwin 通知中发送任何 userInfo,因此您仍然需要配置一个应用组并使用您的应用组标识符建立一个带有 initWithSuiteName:NSUserDefaults 实例。

【讨论】:

    【解决方案2】:

    在您的键盘本身的class KeyboardViewController: UIInputViewController 中,您应该添加您编写的通知代码。你现在在哪里写呢?

    UIInputViewController 子类在使用键盘时运行,而不仅仅是在应用程序运行时。此外,您可能只想在每次视图加载时加载 UIInputViewController 内的 NSUserDefaults 内容,这样您就不必使用通知。本质上,您每次加载键盘视图时都会选择设置。根据您的自定义程度,这可能是最佳的,也可能不是最佳的。

    【讨论】:

      【解决方案3】:

      这似乎是 iOS 8.0.2 中的一个错误,即使在设备上也是如此(我已经在 iPad Air 上进行了测试)。自定义键盘设置未保存,无法从扩展中读取。

      此处解释了需要完全访问权限的解决方案:https://stackoverflow.com/a/26172466/840742

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 2015-11-10
        • 2016-02-03
        • 2019-12-29
        • 2017-12-01
        • 2012-10-02
        • 2011-03-16
        相关资源
        最近更新 更多