与自定义键盘扩展通信,主机应用程序不在设备中工作,但在模拟器中工作

时间:2014-10-02 14:13:34

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

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

HostApp View控制器:

 - (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值,并根据需要更改keyBoard布局:

-(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中设置 RequestsOpenAccess ,并在设置 - >键盘 - customkeyboar->完全访问权限

我的扩展名单:

enter image description here

2 个答案:

答案 0 :(得分:1)

我获得了解决方案,我创建了新的临时配置文件,并启用了应用程序组,并从app group Xcode项目设置target-->capability--Expand App Group并点击< strong> + 添加应用程序组,如下面的屏幕截图:

enter image description here

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

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

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

答案 1 :(得分:0)

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

这是通过要求用户允许完全访问来实现的,这是iOS设置应用程序中的一般设置 - >键盘 - >键盘 - >完全访问(开/关)。

您应该将此设置添加到键盘的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