从键盘的容器应用程序中检测自定义键盘当前是否处于活动状态

时间:2017-03-19 06:09:47

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

作为我正在开发的自定义键盘的用户入职体验的一部分,我想知道我的自定义键盘当前是否在从包含(父)应用程序内输入文本时处于活动状态。

有没有办法做到这一点,类似于discover whether the keyboard is installed的方式?

1 个答案:

答案 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];
}