首先新建target选择keyboard extension,xcode会自动新建一个UIViewController的子类UIInputViewController,遵循了一个协议和方法,刚开始只需知道与普通的UIViewController一样用来展示弹出键盘的视图,可以以任何形式添加子试图布局。
当然,键盘扩展肯定要提供键盘的属性和对于输入删除字符的功能
接着对于自定义的界面布局与一般工程一样,需要注意的是bundle和application的使用。
在bundle中有些文件找不到需要手动添加到Compile Sources中,对于主工程中的文件,例如分类、自定义的类等,可以在xcode右侧的Target Membership中勾选我们的extension,这样在扩展中就可以使用了!
在扩展中无法使用UIApplication,如要进行跳转到主app需使用以下代码(比如跳到自己app的设置界面提示打开full access的功能,需要先跳转app再次进行跳转),其中URL Schemes与跳转其他app相同,在设置中设置或者plist中填写
UIResponder* responder =self;
while((responder = [respondernextResponder]) !=nil) {
if([responderrespondsToSelector:@selector(openURL:)] ==YES) {
[responderperformSelector:@selector(openURL:)
withObject:[NSURLURLWithString:@"KeyboardExtension://"]];
}
}
如果需要与主app共享文件则需要使用Capabilities中的App Group(看到这里你已经发现与主app的交互其实和与其他app交互没有区别)
使用下面的代码进行存储和读取
//存储
UIImage *image = [UImage imageNamed:@"swift知识结构图.jpg"];
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"你的GroupID"];
groupURL = [groupURL URLByAppendingPathComponent:@"123.jpg"];
[UIImageJPEGRepresentation(image,0) writeToURL:groupURL atomically:YES]?NSLog(@"success"):NSLog(@"failed");
//读取
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"你的GroupID"];
NSData *data = [NSData dataWithContentsOfURL:[groupURL URLByAppendingPathComponent:@"123.jpg"]];
UIImage *image = [UIImage imageWithData:data];
注意:在进行键盘扩展开发时,尽量使用frame布局,懒加载,减少首次加载的时间,减少内存使用,避免奔溃。有任何问题都可以留言讨论,互相交流。