与 Host App 的自定义键盘扩展通信在设备中不工作但在模拟器中工作

Posted

技术标签:

【中文标题】与 Host App 的自定义键盘扩展通信在设备中不工作但在模拟器中工作【英文标题】:Communicate with Custom Keyboard extension with Host App not working in device but works in simulator 【发布时间】:2014-10-02 14:13:33 【问题描述】:

我正在使用自定义键盘扩展。这几乎完成了,但是当我与扩展程序和我的主机应用程序通信数据时,我只是面临设备问题,而我的主机应用程序没有在设备中工作,但在模拟器中工作的是同样的事情。我的代码如下:

HostApp 视图控制器:

 - (void)viewDidLoad 

    _defaultvalue = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp.myappname.targetKeyboard"];
    [_defaultvalue setBool:YES forKey:@"Layout"];
    [_defaultvalue synchronize];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


- (IBAction)RightAction:(id)sender 


    _defaultvalue = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp.myappname.targetKeyboard"];
    [_defaultvalue setBool:YES forKey:@"Layout"];
    [_defaultvalue synchronize];



- (IBAction)leftAction:(id)sender 

    _defaultvalue = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp.myappname.targetKeyboard"];
    [_defaultvalue setBool:NO forKey:@"Layout"];
    [_defaultvalue synchronize];

我使用以下代码在我的扩展目标中检查这个BOOL 值,并根据我的需要更改键盘布局:

-(void)LoadKeyboardview


_defaultvalue = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp.myappname.targetKeyboard"];

        if([_defaultvalue boolForKey:@"Layout"])
        
            self.ObjKeyLayout=[[[NSBundle mainBundle]loadNibNamed:@"keyboardLayout" owner:nil options:nil]objectAtIndex:0];
            [self addGesturToKeyBoard];
            self.inputView =self.ObjKeyLayout;

        
        else

            self.ObjKeyLayout=[[[NSBundle mainBundle]loadNibNamed:@"leftLayout" owner:nil options:nil]objectAtIndex:0];
            [self addGesturToKeyBoard];

            self.inputView =self.ObjKeyLayout;

        


相同的代码在模拟器 ios8 设备 iPhone5 中运行良好。请问我在苹果文档中读到NSUserDefaults initWithSuiteName 需要更多代码吗?谢谢。

更新:

我已经在 plist 和 setting->keyboard-customkeyboar->Full Access ON

中设置了 RequestsOpenAccess

我的扩展列表:

【问题讨论】:

【参考方案1】:

我得到的解决方案是创建新的临时配置文件并启用 app-groups 并从我的 Xcode 项目从 target-->capability--Expand App Group 设置 app group 并点击 + 添加应用组,如下图所示:

为我的键盘扩展目标做同样的事情。然后我在NSuserDefault 中使用了这个设置应用程序组标识符:

 _defaultvalue = [[NSUserDefaults alloc] initWithSuiteName:@"group.keyboaredExtention"];
     [_defaultvalue setBool:NO forKey:@"Layout"];
    [_defaultvalue synchronize];

现在在我的设备和模拟器中工作正常。希望对其他人有所帮助。

【讨论】:

@quocViet 我添加了我的答案我是如何解决这个问题的请关注【参考方案2】:

在 iOS8 中,自定义键盘和包含应用程序可以使用共享容器进行通信。

这是通过要求用户允许完全访问来实现的,这是 iOS 设置应用程序中 General->Keyboard->your keyboard->Full Access (ON/OFF) 下的设置。

您应该将此设置添加到键盘的 Info.plist:

RequestsOpenAccess

如需更多信息,请阅读 Apple 的 iOS8 自定义键盘 API 文档: https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/Keyboard.html#//apple_ref/doc/uid/TP40014214-CH16-SW11

【讨论】:

感谢您的回答,我做的事情与我在问题中所说的一样,在我的模拟器中运行良好,但只有设备无法运行。

以上是关于与 Host App 的自定义键盘扩展通信在设备中不工作但在模拟器中工作的主要内容,如果未能解决你的问题,请参考以下文章

适用于iPhone X的自定义键盘inputView.frame大小

获取 ios 8 自定义键盘扩展的“因内存错误而终止”

在键盘应用程序扩展中使用 UITextField

在 Swift 中访问共享容器中的自定义对象

在自定义键盘扩展中播放标准 iOS 键盘点击声音

如何与 Xamarin UITest 中的自定义键盘进行交互?