Custom Keyboard extension与Host App通信在模拟器中能够正常工作,但在设备上却无法正常工作。

3
我正在处理自定义键盘扩展插件。几乎完成了,但在与扩展和我的主机应用程序通信时出现问题。这在模拟器中可以运行,但在设备上无法正常工作。我的代码如下:
主机应用程序视图控制器:
 - (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中相同的代码运行良好。请问是否需要更多的代码?我读过苹果文档,说NSUserDefaultsinitWithSuiteName可以帮助我解决这个问题,谢谢。

更新:

我已经在plist中设置了RequestsOpenAccess,并在设置->键盘-自定义键盘->完全访问中打开了ON。

我的扩展程序Plist:

enter image description here

2个回答

2
我有一个解决方案,我创建了一个新的临时配置文件并启用了应用组,在我的Xcode项目中从target-->capability--Expand App Group设置app group,然后点击+添加应用程序组,如下所示的屏幕截图:

enter image description here

接着对我的键盘扩展目标也做同样的操作。然后我将此设置的应用程序组标识符用于NSuserDefault中:
 _defaultvalue = [[NSUserDefaults alloc] initWithSuiteName:@"group.keyboaredExtention"];
     [_defaultvalue setBool:NO forKey:@"Layout"];
    [_defaultvalue synchronize];

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


@quocViet,我已经添加了我的答案,我是如何解决这个问题的,请仔细阅读。 - Nitin Gohel

1
在iOS8中,自定义键盘和包含的应用程序可以使用共享容器进行通信。
这是通过要求用户允许完全访问来实现的,这是在iOS设置应用程序中的“常规-键盘-您的键盘-完全访问”(开/关)下的设置。
您应该将此设置添加到键盘的Info.plist文件中:
RequestsOpenAccess

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


1
谢谢您的回答。我做了和我的问题中所说的同样的事情,在模拟器中运行良好,但在设备上却不起作用。 - Nitin Gohel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接