【问题标题】:Detect whether custom keyboard is currently active from keyboard's container application从键盘的容器应用程序中检测自定义键盘当前是否处于活动状态
【发布时间】:2017-03-20 01:03:03
【问题描述】:

作为我正在开发的自定义键盘的用户入门体验的一部分,我想知道我的自定义键盘当前是否可用于从包含(父)应用程序中输入文本。

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

【问题讨论】:

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


    【解决方案1】:

    经过进一步研究,我还没有找到实现这一目标的方法。

    但如果有人遇到同样的情况,这是我暂时采用的一种解决方法。

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

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      相关资源
      最近更新 更多