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

问题描述:

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

有没有办法做到这一点,类似于你可以如何discover whether the keyboard is installed

做了一些进一步的研究后,我还没有找到一种方法来完成这一点。

但是,如果任何人处于相同的情况,这里是我暂时采用的解决方法。

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