我正在编写自己的自定义键盘。而且我不知道如何将我的设置包(在手机中设置)与我的键盘扩展连接,所以如果有人从手机设置更改设置,之后打开一些文本字段来写一些我的键盘已经知道的内容而不是他所做的更改设置。我尝试创建应用程序组以将我的应用程序与我的扩展程序连接,并在我的视图控制器中为NSUserDefaultsDidChangeNotification
添加观察者,例如:
var notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.addObserver(self, selector: "settingsDidChange:", name: NSUserDefaultsDidChangeNotification, object: nil)
如果有人在设置中更改了更改设置,则会调用方法,并且我会将我需要阅读的所有内容设置到我的应用程序组中,以便从我的扩展程序中读取它。但是只有当人打开我的应用程序时才会调用此方法,因此如果有人从手机设置更改设置并且无法打开应用程序,我的键盘将不会更改。那么如何为键盘实现我的设置包呢?
答案 0 :(得分:1)
我还没有使用键盘扩展程序,但遇到类似的问题,包括Today和WatchKit扩展程序。 NSUserDefaultsDidChangeNotification
仅在进行更改的同一进程中发布。因此,iPhone应用程序设置内的更改不会在扩展过程中向观察者发出通知。
但是,Darwin通知(CFNotificationCenterGetDarwinNotifyCenter
)会发布到其他进程。
这里'在iPhone应用程序中捕获NSUserDefaultsDidChangeNotification
,向扩展程序发布Darwin通知,在扩展程序中捕获它并最终将其转换为标准NSNotification
更容易消费:
https://gist.github.com/phatblat/f640416c15e11b685511
请注意,您无法在达尔文通知中发送任何userInfo
,因此您仍然需要配置应用群组并使用NSUserDefaults
与initWithSuiteName:
个实例进行对话您的应用组标识符。
答案 1 :(得分:0)
在键盘本身的class KeyboardViewController: UIInputViewController
中,您应该添加您编写的通知代码。你现在在哪里写它?
使用键盘时运行的UIInputViewController
子类,而不仅仅是应用程序运行时。此外,您可能只想在每次加载视图时加载NSUserDefaults
内的UIInputViewController
内容,这样您就可以避免使用通知。基本上,每次加载键盘视图时,您都会获取设置。根据您拥有的定制量,这可能是也可能不是最佳。
答案 2 :(得分:0)
即使在设备上(我已在iPad Air上测试过),它似乎也是iOS 8.0.2中的一个错误。自定义键盘设置未保存,无法从分机读取。
需要完全访问权限的解决方案在此处说明:https://stackoverflow.com/a/26172466/840742