鍵盤項目相關(guān)文檔

該文檔主要是記錄一些關(guān)于自定義鍵盤的相關(guān)操作失晴,基本用法剧腻,注意事項等。

1涂屁、關(guān)于自定義鍵盤

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凉翻、關(guān)于第三方鍵盤的使用權(quán)限
  • 當用戶在安全文本(比如將secureTextEntry屬性設(shè)為YES的輸入框)輸入對象中輸入內(nèi)容,iOS系統(tǒng)將暫時強行調(diào)用系統(tǒng)默認輸入法捻激,以保證用戶的信息安全制轰。當用戶在其他非安全文本輸入對象中輸入時,您的第三方輸入法將被重新調(diào)用胞谭。

    ?

  • 第三方輸入法也沒有資格在電話號碼對象中輸入(就像聯(lián)系人應用中的號碼字段)垃杖。這些輸入對象是專門為電信運營商所指定的一個小的數(shù)字字符集而建立的字符串對象,可以通過其是否具有下面任意一個輸入法類型來識別丈屹。

    1.UIKeyboardTypePhonePad

    2.UIKeyboardTypeNamePhonePad

    當用戶在電話號碼對象中輸入時调俘,系統(tǒng)將暫時強行用相應的標準系統(tǒng)輸入法來替換。而當用戶在其他的輸入對象中輸入并需要一個標準輸入法適配其類型特點的時候旺垒,您的第三方輸入法將會自動恢復彩库。

    ?

  • 程序開發(fā)者可以選擇禁止所有的第三方輸入法在他們的應用中運行:使用定義在UIApplicationDelegate協(xié)議中的application:shouldAllowExtensionPointIdentifier:方法(返回值為NO),從而始終使用系統(tǒng)輸入法。

    ?

  • 由于一個第三方輸入法只能在其UIInputViewController對象的主視圖內(nèi)顯示先蒋,它將不能夠選擇輸入框中的文字骇钦。文本選擇是在應用程序的控制下,而第三方輸入法并沒有權(quán)限來訪問它竞漾。因此這也就意味著在編輯信息的時候無法移動光標眯搭,粘貼、復制以及剪切功能將無法使用业岁。

    ?

  • 第三方輸入法和iOS 8.0的所有應用程序擴展一樣鳞仙,沒有權(quán)限來訪問設(shè)備話筒,所以聽寫輸入也是不可能實現(xiàn)的笔时。

    ?

2棍好、鍵盤項目的創(chuàng)建

1、按照常規(guī)的方式新建一個項目
2、打開新建的項目梳玫,在Xcode中選中File —> New —>Target...
Create1.png
3爹梁、選中iOS —> Application Extension,然后雙擊右邊的Custom Keyboard跳轉(zhuǎn)到項目創(chuàng)建頁面,輸入Project name并點擊finish提澎,創(chuàng)建成功姚垃。
Create2.png
4、創(chuàng)建后,在項目文件的Target中會多一個你創(chuàng)建的Keyboard Extension Target盼忌,項目右邊的文件結(jié)構(gòu)中多了一個Keyboard Extension 文件夾积糯,并且文件夾中多了KeyboardViewController(后面說明)文件。 !
Create3.png

3谦纱、Custom Keyboard 開發(fā)的相關(guān)說明

下圖顯示了一些運行輸入法時的重要元素以及其在一個典型開發(fā)流程中的位置:


keyboard_architecture_2x.png

1看成、鍵盤應用的入口

KeyboardViewController

? 創(chuàng)建項目以后,xcode提供了一個名為KeyboardViewController的類跨嘉,它是UIInputViewController的子類川慌,作為鍵盤應用的入口。在Info.plist中也的NSExtension —> NSExtensionPrincipalClass 中也可以改成別的繼承自UIInputViewController的ViewController作為入口祠乃。

UIInputViewController

? UIInputViewController 提供的常用方法和屬性:

? 1梦重、dismissKeyboard 方法:關(guān)掉鍵盤

? 2、advanceToNextInputMode方法:切換到下一個鍵盤(在自定義鍵盤中必須使用)

? 3亮瓷、inputView 屬性:相當于普通應用ViewController.view.(通過測試琴拧,UIInputViewController.view 和UIInputViewController.inputView 是同一個對象),可以通過向inputView中添加自定義的Subviews來顯示自定?義的View嘱支,給inputView重新賦值為一個自定義的UIInputView對象作為顯示蚓胸。

? 4、textDocumentProxy 屬性:一個實現(xiàn)UIKeyInput協(xié)議的對象除师,通過這個屬性可以實現(xiàn)判斷是否有輸入沛膳,給輸入框插入文本,文本回退等功能(后面解釋)汛聚。

? 還有一些方法暫時沒用到過锹安,還有待發(fā)掘。

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;

? 鍵盤切換操作:

  • 關(guān)掉鍵盤,在UIInputViewController中調(diào)用

    ?[self dismissKeyboard];

  • 切換到下一個鍵盤搓侄,在UIInputViewController中調(diào)用

    [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、關(guān)于info.plist配置中,一些關(guān)鍵的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輸入法特性,那么將這個選項設(shè)置為YES淋硝。
  • PrefersRightToLeft--布爾值雹熬,默認為NO,表示第三方輸入法使用的是否是一個從右到左的語言。如果您的輸入法主語言是從右到左書寫的谣膳,那么講這個選項設(shè)置為YES竿报。
  • PrimaryLanguage--字符串值,默認為en-US(美國英語)继谚,用以表示您輸入法的主語言烈菌,使用模式為<語言>-<地區(qū)>。您可以在這個頁面找到某一語言和地區(qū)所對應的字符串花履。
  • RequestsOpenAccess--布爾值芽世,既Full Access(下一節(jié)會說明),默認為NO臭挽,表示第三方輸入法是否要擴展到已滿足基本輸入法需求的沙箱之外捂襟。如果開放存取功能,您的輸入法將獲得如下特性欢峰,但每一個都有相應的責任:

    ?

    ? 1.訪問位置服務葬荷、通信錄數(shù)據(jù)庫以及相機,每一個都需在第一次訪問時獲得授權(quán)纽帖。

    ? 2.可選擇與容納該輸入法的應用的共享容器宠漩,數(shù)據(jù),資源等懊直,比如在應用中可以定制詞匯表扒吁,數(shù)據(jù)交流等。

    ? 3.能夠?qū)⑤斎氲淖址推渌斎胧录蟼髦练掌鬟M行處理室囊。

    ? 4.可以使用剪切板 UIPasteboard對象

    ? 5.播放音頻雕崩,包括按鍵音:通過調(diào)用 playInputClick 方法設(shè)置

    ? 6.訪問iCloud,例如融撞,能夠確保輸入法的設(shè)置以及您的自動修正詞匯能夠在所有用戶設(shè)備上同步盼铁。

    ? 7.通過包含還輸入法的應用,能夠訪問Game Center和應用內(nèi)購買尝偎。

    ? 8.能夠和受控應用進行協(xié)同饶火,如果您使用來設(shè)計該輸入法以支持移動設(shè)備管理(MDM)鹏控。

    ?

5、Full Access

Full Access 能力與限制 隱私考慮
關(guān)閉 (默認) 1肤寝、輸入法可以執(zhí)行一個基本輸入法的所有正常功能当辐; 2、存儲一個常用文本的自動更正和建議到單詞詞典(lexicon) 鲤看; 3缘揪、有權(quán)使用在設(shè)置中的用戶詞典 ; 4刨摩、不能和包含它的應用共享數(shù)據(jù); 5寺晌、除了自定義鍵盤自身容器意外,無法訪問其他文件系統(tǒng)澡刹; 6呻征、無法直接或者間接參與iCloud,游戲中心罢浇,或在應用程序中購買陆赋。 用戶在使用自定義鍵盤的過程中知道輸入的內(nèi)容只會傳到輸入框所在的app中
開啟 1、除聯(lián)網(wǎng)外的所有自定義鍵盤擁有的功能 2嚷闭、訪問位置服務攒岛、通信錄數(shù)據(jù)庫以及相機,每一個都需在第一次訪問時獲得授權(quán)胞锰。 3灾锯、能夠?qū)⑤斎氲淖址推渌斎胧录蟼髦练掌鬟M行處理。 4嗅榕、可選擇與容納該輸入法的應用的共享容器顺饮,數(shù)據(jù),資源等凌那,比如在應用中可以定制詞匯表兼雄,數(shù)據(jù)交流等。 5帽蝶、可以使用剪切板 UIPasteboard對象 6赦肋、播放音頻,包括按鍵音:通過調(diào)用 playInputClick 方法設(shè)置 7励稳、訪問iCloud佃乘,例如,能夠確保輸入法的設(shè)置以及您的自動修正詞匯能夠在所有用戶設(shè)備上同步驹尼。 8趣避、通過包含還輸入法的應用,能夠訪問Game Center和應用內(nèi)購買扶欣。 9鹅巍、能夠和受控應用進行協(xié)同,如果您使用來設(shè)計該輸入法以支持移動設(shè)備管理(MDM)料祠。 1骆捧、用戶知道他們輸入的內(nèi)容可能會提供給鍵盤開發(fā)者 2、必須遵守在App Store審核指南以及iOS開發(fā)者程序許可協(xié)議中的聯(lián)網(wǎng)輸入法指南髓绽,可以在App Review Support頁面中找到
在鍵盤應用中是否獲得Full Access 的方法:
if ([UIPasteboard generalPasteboard]) {
    //Full Access
} else {
    //No Full Access
}

6敛苇、主應用程序和鍵盤應用的數(shù)據(jù)交流

? 首先需要有開了Full Access之后才能在你主應用和鍵盤應用之間作數(shù)據(jù)交流,所以在鍵盤的info.plist文件中將RequestsOpenAccess鍵設(shè)置yes顺呕,讓用戶在設(shè)置中有Full Access選項

1枫攀、創(chuàng)建*.entitlements 文件
  • 在Xcode上方的導航欄中,選中File > New >File株茶,然后選中右邊的Resource来涨,再創(chuàng)建一個plist文件。


    AddPlist.png
  • 選中-右鍵新創(chuàng)建的plist文件启盛,然后進入Finder蹦掐,將plist文件的后綴由*.plist 改成 *.entitlements,

  • 重新將創(chuàng)建的*.entitlements文件拉到項目中去僵闯,并勾選上主應用和拓展應用的Target


    AddFile.png
  • 在xcode中打開*.entitlements文件卧抗,添加一個array類型的key:com.apple.security.application-groups

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

? 這個GroupID作為主應用和Extension應用數(shù)據(jù)交流的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對象進行數(shù)據(jù)交流。

7张漂、其他問題

待補充

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晶默,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子航攒,更是在濱河造成了極大的恐慌磺陡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漠畜,死亡現(xiàn)場離奇詭異币他,居然都是意外死亡,警方通過查閱死者的電腦和手機憔狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門蝴悉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘾敢,你說我怎么就攤上這事拍冠∧蛘猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵庆杜,是天一觀的道長射众。 經(jīng)常有香客問我,道長晃财,這世上最難降的妖魔是什么叨橱? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮断盛,結(jié)果婚禮上罗洗,老公的妹妹穿的比我還像新娘。我一直安慰自己钢猛,他們只是感情好伙菜,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著命迈,像睡著了一般仇让。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躺翻,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天丧叽,我揣著相機與錄音,去河邊找鬼公你。 笑死踊淳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的陕靠。 我是一名探鬼主播迂尝,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剪芥!你這毒婦竟也來了垄开?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤税肪,失蹤者是張志新(化名)和其女友劉穎溉躲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體益兄,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡锻梳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了净捅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疑枯。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛔六,靈堂內(nèi)的尸體忽然破棺而出荆永,到底是詐尸還是另有隱情废亭,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布具钥,位于F島的核電站滔以,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氓拼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一抵碟、第九天 我趴在偏房一處隱蔽的房頂上張望桃漾。 院中可真熱鬧,春花似錦拟逮、人聲如沸撬统。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋追。三九已至,卻和暖如春罚屋,著一層夾襖步出監(jiān)牢的瞬間苦囱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工脾猛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撕彤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓猛拴,卻偏偏與公主長得像羹铅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子愉昆,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫职员、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • 1 我是一只狗跛溉,我的眼里只有肉焊切。對,有肉誰吃骨頭芳室。剛才我在垃圾桶里發(fā)現(xiàn)一塊肉蛛蒙,很大一塊,現(xiàn)在我的眼中只有它渤愁。 我是...
    咕哩姐閱讀 551評論 1 3
  • 現(xiàn)在的我做的一切都是隱忍 隱忍是為了離開老傻逼的時候讓她崩潰 越王勾踐臥薪嘗膽還那么多年 我能沉得住氣
    巴爾札克嘿閱讀 87評論 0 0
  • 大家一定都去過東北吧牵祟?在東北,有一件令我十分難忘的事抖格。這次旅程我自始至終都待在一個地方诺苹,但整個旅程都很有意思咕晋。 我...
    五班張苑博作文閱讀 191評論 1 1