【发布时间】:2017-03-20 01:03:03
【问题描述】:
作为我正在开发的自定义键盘的用户入门体验的一部分,我想知道我的自定义键盘当前是否可用于从包含(父)应用程序中输入文本。
有没有办法做到这一点,类似于discover whether the keyboard is installed?
【问题讨论】:
标签: ios ios-app-extension custom-keyboard
作为我正在开发的自定义键盘的用户入门体验的一部分,我想知道我的自定义键盘当前是否可用于从包含(父)应用程序中输入文本。
有没有办法做到这一点,类似于discover whether the keyboard is installed?
【问题讨论】:
标签: ios ios-app-extension custom-keyboard
经过进一步研究,我还没有找到实现这一目标的方法。
但如果有人遇到同样的情况,这是我暂时采用的一种解决方法。
1.检测键盘变化
您的键盘在安装后不会自动成为活动键盘,因此如果您提示用户交换键盘,您可以使用UITextInputCurrentInputModeDidChangeNotification 检测到此类更改。不能保证用户切换到您的键盘,而不是表情符号键盘,但这是我选择做出的假设。
你可以这样使用它:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidChange:) name:UITextInputCurrentInputModeDidChangeNotification object:nil];
}
- (void)keyboardDidChange:(NSNotification *)notification {
// keyboard changed, do your thing here
}
2。共享应用组
另一种方法是设置一个共享应用程序组,并在激活后从键盘写入Shared User Defaults。然后在您的包含应用程序中,您可以设置一个NSTimer 作为运行循环,您可以在其中检查是否已写入用户默认值。例如,这可能类似于当前日期,您可以检查它是否足够近(几秒钟内)以表明最近的更改。
我没有使用它,因为它会增加一些开销,但它会是一个比键盘更改通知更简单的解决方案(从用户的角度来看)。
这是一个如何完成的示例。
KeyboardViewController.m:
- (void)viewDidLoad {
[super viewDidLoad];
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.bundleID"];
[sharedDefaults setObject:[NSDate date] forKey:@"lastOpenDate"];
[sharedDefaults synchronize];
}
CompanionViewController.m:
- (void)viewDidLoad {
[super viewDidLoad];
NSTimer *runloop = [NSTimer scheduledTimerWithTimeInterval:0.5 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.bundleID"];
[sharedDefaults synchronize];
NSDate *lastOpenDate = [sharedDefaults objectForKey:@"lastOpenDate"];
if (lastOpenDate != nil && [lastOpenDate timeIntervalSinceNow] > -1.0) {
[timer invalidate];
// keyboard changed, do your thing here
}
}
[runloop fire];
}
【讨论】: