键盘项目相关文档

该文档主要是记录一些关于自定义键盘的相关操作,基本用法,注意事项等。

1、关于自定义键盘

1、官方文档上的定义

​ A custom keyboard replaces the system keyboard for users who want capabilities such as a novel text input method or the ability to enter text in a language not otherwise supported in iOS. The essential function of a custom keyboard is simple: Respond to taps, gestures, or other input events and provide text, in the form of an unattributed NSString object, at the text insertion point of the current text input object.

​ 由这个定义可以知道,在自定义键盘中,你可以像普通应用一样做点击事件和手势,或者做键盘应该有的输入事件。其中需要注意的是,作为键盘输入的文本,必须是unattributed 的 NSString对象。

2、在自定义键盘中至少必须提供的东西
  • 一个基本的键盘页面
  • 一个切换到别的键盘的按键

3、关于第三方键盘的使用权限
  • 当用户在安全文本(比如将secureTextEntry属性设为YES的输入框)输入对象中输入内容,iOS系统将暂时强行调用系统默认输入法,以保证用户的信息安全。当用户在其他非安全文本输入对象中输入时,您的第三方输入法将被重新调用。

  • 第三方输入法也没有资格在电话号码对象中输入(就像联系人应用中的号码字段)。这些输入对象是专门为电信运营商所指定的一个小的数字字符集而建立的字符串对象,可以通过其是否具有下面任意一个输入法类型来识别。

    1.UIKeyboardTypePhonePad

    2.UIKeyboardTypeNamePhonePad

    当用户在电话号码对象中输入时,系统将暂时强行用相应的标准系统输入法来替换。而当用户在其他的输入对象中输入并需要一个标准输入法适配其类型特点的时候,您的第三方输入法将会自动恢复。

  • 程序开发者可以选择禁止所有的第三方输入法在他们的应用中运行:使用定义在UIApplicationDelegate协议中的application:shouldAllowExtensionPointIdentifier:方法(返回值为NO),从而始终使用系统输入法。

  • 由于一个第三方输入法只能在其UIInputViewController对象的主视图内显示,它将不能够选择输入框中的文字。文本选择是在应用程序的控制下,而第三方输入法并没有权限来访问它。因此这也就意味着在编辑信息的时候无法移动光标,粘贴、复制以及剪切功能将无法使用。

  • 第三方输入法和iOS 8.0的所有应用程序扩展一样,没有权限来访问设备话筒,所以听写输入也是不可能实现的。

2、键盘项目的创建

1、按照常规的方式新建一个项目
2、打开新建的项目,在Xcode中选中File —> New —>Target...
Create1.png
3、选中iOS —> Application Extension,然后双击右边的Custom Keyboard跳转到项目创建页面,输入Project name并点击finish,创建成功。
Create2.png
4、创建后,在项目文件的Target中会多一个你创建的Keyboard Extension Target,项目右边的文件结构中多了一个Keyboard Extension 文件夹,并且文件夹中多了KeyboardViewController(后面说明)文件。 !
Create3.png

3、Custom Keyboard 开发的相关说明

下图显示了一些运行输入法时的重要元素以及其在一个典型开发流程中的位置:


keyboard_architecture_2x.png

1、键盘应用的入口

KeyboardViewController

​ 创建项目以后,xcode提供了一个名为KeyboardViewController的类,它是UIInputViewController的子类,作为键盘应用的入口。在Info.plist中也的NSExtension —> NSExtensionPrincipalClass 中也可以改成别的继承自UIInputViewController的ViewController作为入口。

UIInputViewController

​ UIInputViewController 提供的常用方法和属性:

​ 1、dismissKeyboard 方法:关掉键盘

​ 2、advanceToNextInputMode方法:切换到下一个键盘(在自定义键盘中必须使用)

​ 3、inputView 属性:相当于普通应用ViewController.view.(通过测试,UIInputViewController.view 和UIInputViewController.inputView 是同一个对象),可以通过向inputView中添加自定义的Subviews来显示自定�义的View,给inputView重新赋值为一个自定义的UIInputView对象作为显示。

​ 4、textDocumentProxy 属性:一个实现UIKeyInput协议的对象,通过这个属性可以实现判断是否有输入,给输入框插入文本,文本回退等功能(后面解释)。

​ 还有一些方法暂时没用到过,还有待发掘。

2、键盘输入等基本操作

​ 键盘的输入操作主要是通过UIInputViewController中的textDocumentProxy 属性提供的几个主要方法:

  • 输入文本:

    ​ [self.textDocumentProxy insertText:@"hello "];

  • 回退操作:

    ​ [self.textDocumentProxy deleteBackward];

  • 输入换行操作:

    ​ [self.textDocumentProxy insertText:@"\n"];

  • 输入的上一个字符

    ​ @property (nonatomic, readonly) NSString *documentContextBeforeInput;

  • 即将输入的一个字符

    ​ @property (nonatomic, readonly) NSString *documentContextAfterInput;

  • 将输入的字符移动到某一位置

    ​ -(void)adjustTextPositionByCharacterOffset:(NSInteger)offset;

​ 键盘切换操作:

  • 关掉键盘,在UIInputViewController中调用

    ​[self dismissKeyboard];

  • 切换到下一个键盘,在UIInputViewController中调用

    [self advanceToNextInputMode];

3、修改键盘高度

//官方文档:you can adjust a custom keyboard’s height any time after its primary view        initially draws on screen.
//但是如果修改高度的约束的时候会有约束冲突的warning输出
//有些情况下,如在邮件中退到后台在回来重新显示键盘时,ViewDidAppear 不会被运行到,所以修改约束在    ViewWillAppear中处理
NSLayoutConstraint *heightConstraint =
[NSLayoutConstraint constraintWithItem: self.view
                             attribute: NSLayoutAttributeHeight
                             relatedBy: NSLayoutRelationEqual
                                toItem: nil
                             attribute: NSLayoutAttributeNotAnAttribute
                            multiplier: 0.0
                              constant:kKeyboardHeight];
[self.view addConstraint:heightConstraint];

4、关于info.plist配置中,一些关键的key说明

1、Bundle display name && Bundle name

​ 在Settings > General > Keyboard > Keyboards 中显示的keyboard 名称为:

​ Keyboard extension Bundle name - Main Application Bundle name

​ 在Settings > General > Keyboard > Keyboards > Add New Keyboard…中显示的名称为:

​ Keyboard extension Bundle name

2、NSExtension
NSExtension.png

NSExtensionAttributes里面的配置表示着custom keyboard的特点和需求。

  • IsASCIICapable--布尔值,默认为NO,表示第三方输入法是否可以向文档中插入ASCII字符串。如果您的第三方输入法专门提供UIKeyboardTypeASCIICapable输入法特性,那么将这个选项设置为YES。
  • PrefersRightToLeft--布尔值,默认为NO,表示第三方输入法使用的是否是一个从右到左的语言。如果您的输入法主语言是从右到左书写的,那么讲这个选项设置为YES。
  • PrimaryLanguage--字符串值,默认为en-US(美国英语),用以表示您输入法的主语言,使用模式为<语言>-<地区>。您可以在这个页面找到某一语言和地区所对应的字符串。
  • RequestsOpenAccess--布尔值,既Full Access(下一节会说明),默认为NO,表示第三方输入法是否要扩展到已满足基本输入法需求的沙箱之外。如果开放存取功能,您的输入法将获得如下特性,但每一个都有相应的责任:

    ​ 1.访问位置服务、通信录数据库以及相机,每一个都需在第一次访问时获得授权。

    ​ 2.可选择与容纳该输入法的应用的共享容器,数据,资源等,比如在应用中可以定制词汇表,数据交流等。

    ​ 3.能够将输入的字符和其他输入事件上传至服务器进行处理。

    ​ 4.可以使用剪切板 UIPasteboard对象

    ​ 5.播放音频,包括按键音:通过调用 playInputClick 方法设置

    ​ 6.访问iCloud,例如,能够确保输入法的设置以及您的自动修正词汇能够在所有用户设备上同步。

    ​ 7.通过包含还输入法的应用,能够访问Game Center和应用内购买。

    ​ 8.能够和受控应用进行协同,如果您使用来设计该输入法以支持移动设备管理(MDM)。

5、Full Access

Full Access 能力与限制 隐私考虑
关闭 (默认) 1、输入法可以执行一个基本输入法的所有正常功能; 2、存储一个常用文本的自动更正和建议到单词词典(lexicon) ; 3、有权使用在设置中的用户词典 ; 4、不能和包含它的应用共享数据; 5、除了自定义键盘自身容器意外,无法访问其他文件系统; 6、无法直接或者间接参与iCloud,游戏中心,或在应用程序中购买。 用户在使用自定义键盘的过程中知道输入的内容只会传到输入框所在的app中
开启 1、除联网外的所有自定义键盘拥有的功能 2、访问位置服务、通信录数据库以及相机,每一个都需在第一次访问时获得授权。 3、能够将输入的字符和其他输入事件上传至服务器进行处理。 4、可选择与容纳该输入法的应用的共享容器,数据,资源等,比如在应用中可以定制词汇表,数据交流等。 5、可以使用剪切板 UIPasteboard对象 6、播放音频,包括按键音:通过调用 playInputClick 方法设置 7、访问iCloud,例如,能够确保输入法的设置以及您的自动修正词汇能够在所有用户设备上同步。 8、通过包含还输入法的应用,能够访问Game Center和应用内购买。 9、能够和受控应用进行协同,如果您使用来设计该输入法以支持移动设备管理(MDM)。 1、用户知道他们输入的内容可能会提供给键盘开发者 2、必须遵守在App Store审核指南以及iOS开发者程序许可协议中的联网输入法指南,可以在App Review Support页面中找到
在键盘应用中是否获得Full Access 的方法:
if ([UIPasteboard generalPasteboard]) {
    //Full Access
} else {
    //No Full Access
}

6、主应用程序和键盘应用的数据交流

首先需要有开了Full Access之后才能在你主应用和键盘应用之间作数据交流,所以在键盘的info.plist文件中将RequestsOpenAccess键设置yes,让用户在设置中有Full Access选项

1、创建*.entitlements 文件
  • 在Xcode上方的导航栏中,选中File > New >File,然后选中右边的Resource,再创建一个plist文件。


    AddPlist.png
  • 选中-右键新创建的plist文件,然后进入Finder,将plist文件的后缀由*.plist 改成 *.entitlements,

  • 重新将创建的*.entitlements文件拉到项目中去,并勾选上主应用和拓展应用的Target


    AddFile.png
  • 在xcode中打开*.entitlements文件,添加一个array类型的key:com.apple.security.application-groups

  • 然后添加一个Item代表Group Id
    GroupId.png

这个GroupID作为主应用和Extension应用数据交流的Identity

  • 分别在Main Target 和 Extension Target 的Build setting中,查找Code Signing Entitlements,并在这个key中加入这个文件的相对路径,如:Test.entitlements文件放在项目文件中的根目录,则直接写入Test.entitlements,如果Test.entitlements放在A目录,则写入A/Test.entitlements。
    Entitlements.png
  • 键盘和主应用通过[[NSUserDefaults alloc] initWithSuiteName:kGroupIdentifier]; 获得UserDefault对象进行数据交流。

7、其他问题

待补充

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,036评论 1 32
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,612评论 4 59
  • 1 我是一只狗,我的眼里只有肉。对,有肉谁吃骨头。刚才我在垃圾桶里发现一块肉,很大一块,现在我的眼中只有它。 我是...
    咕哩姐阅读 535评论 1 3
  • 现在的我做的一切都是隐忍 隐忍是为了离开老傻逼的时候让她崩溃 越王勾践卧薪尝胆还那么多年 我能沉得住气
    巴尔札克嘿阅读 82评论 0 0
  • 大家一定都去过东北吧?在东北,有一件令我十分难忘的事。这次旅程我自始至终都待在一个地方,但整个旅程都很有意思。 我...
    五班张苑博作文阅读 186评论 1 1