作为我正在开发的自定义键盘的用户入职体验的一部分,我想知道我的自定义键盘当前是否在从包含(父)应用程序内输入文本时处于活动状态。
有没有办法做到这一点,类似于discover whether the keyboard is installed的方式?
答案 0 :(得分:0)
在做了一些进一步的研究之后,我还没有找到实现这个目标的方法。
但如果有人处于相同的情况,这是我暂时采用的解决方法。
<强> 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
作为runloop,在其中检查是否已写入用户默认值。例如,这可以是当前日期,并且您检查它是否足够(在几秒钟内)指示最近的更改。
我没有使用它,因为它增加了一些开销,但从键盘更改通知开始,这将是一个更加万无一失的解决方案(从用户的角度来看)。
这是一个如何完成的例子。
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];
}