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

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

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值,并根据我的需要更改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中运行良好。 请问有没有更多的代码需要我在苹果doc中读到,说NSUserDefaults initWithSuiteName帮助我谢谢你。

更新:

我已经在plist和setting-> keyboard-customkeyboar-> Full Access ON中设置了RequestsOpenAccess

我的扩展名单:

在此处输入图像描述

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

在此处输入图像描述

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

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

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

在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