ios 键盘开发

准备

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"];
}
相关推荐
namehu1 小时前
React Native 应用性能分析与优化不完全指南
android·react native·ios
文心快码BaiduComate2 小时前
弟弟想看恐龙,用文心快码3.5S快速打造恐龙乐园
前端·后端·程序员
大模型教程3 小时前
半小时部署企业智能问答系统!MaxKB让知识管理效率翻倍
程序员·llm·agent
AI大模型3 小时前
告别数据隐私焦虑!我用FastGPT免费私有化部署了AI个人知识管理系统辅助写作
程序员·llm·agent
大模型教程3 小时前
基于Dify的RAG知识库搭建
程序员·llm·agent
AI大模型4 小时前
微软AI Agents入门课程爆火!GitHub星标破万,零基础构建AI智能体
程序员·llm·agent
SimonKing4 小时前
除了 ${},Thymeleaf 的这些用法让你直呼内行
java·后端·程序员
小小前端_我自坚强6 小时前
Tailwind CSS 详解
css·程序员·开源
陈哥聊测试7 小时前
各角色如何从DevOps中受益?
程序员·自动化运维·devops
游戏开发爱好者87 小时前
BShare HTTPS 集成与排查实战,从 SDK 接入到 iOS 真机调试(bshare https、签名、回调、抓包)
android·ios·小程序·https·uni-app·iphone·webview