該文檔主要是記錄一些關(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...
3爹梁、選中iOS —> Application Extension,然后雙擊右邊的Custom Keyboard跳轉(zhuǎn)到項目創(chuàng)建頁面,輸入Project name并點擊finish提澎,創(chuàng)建成功姚垃。
4、創(chuàng)建后,在項目文件的Target中會多一個你創(chuàng)建的Keyboard Extension Target盼忌,項目右邊的文件結(jié)構(gòu)中多了一個Keyboard Extension 文件夾积糯,并且文件夾中多了KeyboardViewController(后面說明)文件。 !
3谦纱、Custom Keyboard 開發(fā)的相關(guān)說明
下圖顯示了一些運行輸入法時的重要元素以及其在一個典型開發(fā)流程中的位置:
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
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文件。
選中-右鍵新創(chuàng)建的plist文件启盛,然后進入Finder蹦掐,將plist文件的后綴由*.plist 改成 *.entitlements,
-
重新將創(chuàng)建的*.entitlements文件拉到項目中去僵闯,并勾選上主應用和拓展應用的Target
在xcode中打開*.entitlements文件卧抗,添加一個array類型的key:com.apple.security.application-groups
-
然后添加一個Item代表Group Id
? 這個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泳秀。
鍵盤和主應用通過[[NSUserDefaults alloc] initWithSuiteName:kGroupIdentifier]; 獲得UserDefault對象進行數(shù)據(jù)交流。
7张漂、其他問題
待補充