如何从应用扩展程序获取主机的应用程序对象?

时间:2014-10-08 13:57:47

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

我有自定义键盘扩展程序。我需要知道我的键盘显示/隐藏的时间。 我读了this文章,这个块:

- (void)registerForKeyboardNotifications
{

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasShown:)
                                                 name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden:)
                                                 name:UIKeyboardWillHideNotification object:nil];

}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{

}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{


}

但是这段代码实现到应用程序中。 addObserver参数self表示它。那么,我怎样才能从我的主机应用程序中获取一个对象(可能是任何带有文本字段的应用程序)来传递注册通知?

或者,如果显示/隐藏键盘,还可以注册其他三个选项吗?

isfirstResponder也来自扩展 - 我认为不是一个选项。

3 个答案:

答案 0 :(得分:0)

这对我来说可能为时已晚,但您无法从NSNotifications获取该信息,实际上我认为此代码无法正常工作,因为大多数NSNotifications都在沙箱中被禁用键盘扩展名。

例如,我尝试使用OnCopyClipboard通知,但这对我没用。你有没有跑步?我对这些结果非常感兴趣。

抱歉,我不得不说,这是因为沙盒的键盘扩展名是众所周知的。

答案 1 :(得分:0)

当我使用Extensions时遇到同样的问题,这也是同样的问题。我搜索了很多地方,发现我们可以从扩展程序发送到主应用程序,

您可以使用CFNotificationCenterGetDarwinNotifyCenter

来使用它

以下是我撰写的与此https://medium.com/@saberjack/ios-sending-notifications-between-your-apps-3fe7422d6a41

相关的博客链接

希望这有帮助

答案 2 :(得分:0)

您需要启用两个目标的应用组,以便能够在您的扩展程序和包含的应用之间共享NSUserDefaults,这是一个小指南:

  1. 在Project Navigator中,在左上角单击小箭头以显示目标列表。
  2. 点击YOUR_PROJECT_NAME_TARGET,切换到顶部菜单中的功能,然后向下滚动到应用程序组。
  3. 开启App Groups开关。
  4. 选择要用于配置的开发团队,然后单击“选择”(这会将“应用程序组”权利添加到您的应用程序ID)。
  5. 点击+添加新的应用群组,并将其命名为group.YOUR_COMPANY.YOUR_TARGET_NAME
  6. Xcode现在将为您的App ID添加“App Groups容器”权利。如果一切都按预期进行,那么新的应用程序组应该在那里并且应该进行检查。 enter image description here
  7. 现在您需要为Extension目标重复这些步骤。 (将YOUR_PROJECT_NAME_TARGET替换为YOUR_EXTENSION_NAME_TARGET),这次您将使用相同的已创建应用组,而不是像之前步骤中那样创建新的应用组和开发团队。
  8. 返回代码:  8.在Container App中,选择要与扩展共享数据的视图控制器,并添加以下代码块:

    NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"YOUR_GROUP_NAME"];
    [sharedDefaults setInteger:[self.textField.text integerValue] forKey:@"MyNumberKey"];
    [sharedDefaults synchronize];
    
    1. 在这里,我们只是在我们的应用程序组中分配/初始化新的NSUserDefaults,并将在textField中输入的数字存储在MyNumberKey下。
    2. 在分机视图控制器中:

      1. 在初始化方法中,添加此代码块[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDefaultsDidChange:) name:NSUserDefaultsDidChangeNotification object:nil];
      2. 如果您想访问共享数据:NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"YOUR_GROUP_NAME"]; NSInteger number = [defaults integerForKey:@"MyNumberKey"];
      3. 完成!