准备
1、新建扩展
选择keyboard
选中targets 中的键盘target -- CustomKeyBoard
设置 minimum deployments 不然的话 在低版本的设备中跑起来无效
2、设置podfile
arduino
target '主APP' do
use_frameworks!
pod 'Masonry' // 引用第三方
end
// **重要** 扩展
target 'CustomKeyBoard' do
use_frameworks!
pod 'Masonry' // 引用第三方
end
3、 设置键盘扩展的info.plist
plist中的字段App Extension Keys中都有解释。
PrimaryLanguage
- 默认为en_US
的字串。中文为:zh_CN
。以<语种>_<区域>的形式描述键盘的主语言。更多内容请参考
RequestsOpenAccess
默认为NO的布尔值。是否需要比基础键盘更大的沙盒范围。把该值置为YES将需要完全访问
权限,你的键盘将获得如下能力,每个能力都伴随有相应的权限:
- 访问定位服务,通讯录数据库,相机,每个都需要用户允许
- 与键盘的容器app共享容器数据,以便完成比如在容器app中管理用户词库的界面的功能
- 通过网络发送按键、输入事件之类的数据供云端处理
- 使用UIPasteboard类
- 播放音频,包括使用playInputClick方法播放按键音
- 访问iCloud,可以用来根据用户身份同步比如键盘设置、自定义自动纠错词典
- 通过容器app访问游戏中心和应用内购买
- 如果你的键盘支持移动设备管理(MDM),可以与被管理的app无缝合作
4、文件引用
新建pch。在keyboard targets中引入pch文件
5、报错:编译错误 Undefined symbol: OBJC_CLASS$_xxxx
引用了其他target的文件,
或者:
6、引用资源无效
同上面文件的引用
功能代码
1、设置键盘高度
objectivec
//参考来源 https://cloud.tencent.com/developer/ask/sof/115790183
@property (nonatomic, assign) NSLayoutConstraint *heightConstraint;
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self updateKeyBoardHeight];
}
- (void)updateKeyBoardHeight {
CGFloat height = 400;
if (self.heightConstraint == nil) {
NSLayoutConstraint *heightConstraint =
[NSLayoutConstraint constraintWithItem: self.view
attribute: NSLayoutAttributeHeight
relatedBy: NSLayoutRelationEqual
toItem: nil
attribute: NSLayoutAttributeNotAnAttribute
multiplier: 0.0
constant: height];
[self.view addConstraint: heightConstraint];
} else {
self.heightConstraint.constant = height;
}
}
2、判断是否添加了键盘
在主APP中,一般需要引导用户将自定义键盘添加到键盘列表中,可以使用这样的方法
objectivec
+ (BOOL)isKeyboardEnabled {
NSArray *obj = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleKeyboards"]; ///< 这里是固定的default中的key,不用改
if (IsEmpty(obj)) {
return NO;
}
return [obj containsObject:@"你自己键盘的bundleID"];
}
3、判断是否开启了完全访问权限
在键盘扩展中
ini
BOOL full = self.hasFullAccess;
4、数据交互
通过 App Groups 共同维护 UserDefault 是一种比较简单的通讯方法。但是开发者也需要注意的是如果我们的键盘没有获取到没有完全访问权限,键盘是只能读取,没法修改 UserDefault 的值的(如果这个 UserDefault 是 Containing app 创建的)。 来源
如果需要和主APP进行数据交互。开启完全访问权限是必要的,同时,扩展和主app都需要用到的文件,需要勾选相应的target,参照上面的【编译错误】
1、开启完全访问权限 2、添加App Groups
添加App Groups
在xcode中添加Capability
配置证书
1、最简单的是通过Xcode自动添加(前提是登录了开发者账号)
2、手动添加 配置主app的bundleid和描述文件 配置扩展的bundleid和描述文件 配置app的groupid并将主app和扩展的描述文件添加AppGroups的权限
一般来说,最简单的方式是使用userdefault来存储、读取。
objectivec
// .h
+ (void)keyboardNetGender:(NSInteger)gender; //存
+ (NSInteger)keyboardNetGender; //取
// .m
+ (void)keyboardNetGender:(NSInteger)gender {
[[self keyboardDefaults] setInteger:gender forKey:keyboard_netgender];
}
+ (NSDictionary *)keyboardNetParam {
id obj = [[self keyboardDefaults] valueForKey:keyboard_netparam];
return obj;
}
+ (NSInteger)keyboardNetGender {
return [[[self keyboardDefaults] valueForKey:keyboard_netgender] integerValue];
}
+ (NSUserDefaults *)keyboardDefaults {
return [[NSUserDefaults alloc] initWithSuiteName:@"你的groupID"];
}