因為 iKeywi 已經在 AppStore 上架的關係,
最近也有一些人問我如何開發鍵盤,或者有什麼祕訣可以比較快完成...
所以簡單寫一下開發 iOS 8 鍵盤前你必須注意的事項,了解到底什麼是可以什麼是不行做到的。
如果你是一般使用者,閒著沒事也可以看一下,了解 iOS 8 第三方鍵盤跟原生鍵盤到底哪裡不一樣。
首先,如果你要開發,第一個一定要看的就是官方文件,
那最一開始,我們要知道什麼是官方有提供的功能,
不過在這之前,官方API告訴了我們哪些是「沒有提供的功能」,
我下面有列出來,所以如果不想看英文直接看底下。
iOS users also expect autocapitalization: In a standard text field, the first letter of a sentence in a case-sensitive language is automatically capitalized.
These features and others are listed next.
Appropriate layout and features based on keyboard type trait
Autocorrection and suggestion
Automatic capitalization
Automatic period upon double space
Caps lock support
Keycap artwork
Multistage input for ideographic languages
You can decide whether or not to implement such features; there is no dedicated API for any of the features just listed, so providing them is a competitive advantage.
這邊提到,使用者期望要有以下功能:
- 在不同 keyboard type 下適當的layout(例如在輸入網頁的地方應該要提供 .com 按鍵)
- 自動修正跟建議
- 自動大寫
- 按兩下空白鍵輸出句點
- 大寫鎖定
- 按鍵按下的popup效果
- 候選字(這邊指的是中文跟日文這種一個輸入可能對應多個字的情況)
但是這些功能全部沒有提供啦,所以要靠自己寫!(翻桌)
iKeywi 除了第一項之外,其他都算有做出來,
我看很多那種純美化看起來很套一些花花綠綠的鍵盤,幾乎都沒有作這些功能,
就純賣外觀而已...(而且還賣的很好)。
總之,這些功能要靠自己寫,更不可能直接去調用內建功能,
所以如果你的 idea 是「使用內建注音加swipe功能」或者「內建注音加遮蔽效果」
這種想法的話,還是洗洗睡等 JB 來玩 tweak 製作比較實在。
除了上面這些之外,我再補幾個細節,也是官方沒有直接提供的,但是使用者會「期望」有這些功能
- 按住「刪除鍵」之後的刪除整段效果
- 按住按鍵之後出現的文字變體(英文鍵盤那些都有)
- 預測字(要去找 ngrams)
- 按鍵聲(注意,按鍵音量跟系統內建的音量會有差異,而且不可以用 [[UIDevice currentDevice] playInputClick])
建議有空選幾個來做,這些不是一定要有,但是作了會更好。
另外以下是沒有提供,但是你也沒辦法做出來的功能,
根據官方原文說法是這樣的,歡迎參考,但是我在底下直接整理列表,更清楚。
Because a custom keyboard can draw only within the primary view of its UIInputViewController object, it cannot select text. Text selection is under the control of the app that is using the keyboard. If that app provides an editing menu interface (such as for Cut, Copy, and Paste), the keyboard has no access to it. A custom keyboard cannot offer inline autocorrection controls near the insertion point.
Custom keyboards, like all app extensions in iOS 8.0, have no access to the device microphone, so dictation input is not possible.
Finally, it is not possible to display key artwork above the top edge of a custom keyboard’s primary view, as the system keyboard does on iPhone when you tap and hold a key in the top row.
沒有提供,但是你也做不出來的功能有:
- 語音輸入
- 長按地球鍵出現輸入法列表
- 選取文字功能
- 讀取輸入內容(只能讀到游標前後大概10幾20個字,無法讀到全部)
- 使用系統內建的鍵盤設定(自動大寫那些設定)
- 使用浮動框來作自動修正(在錯誤的文字上面會跳出修正建議)
- 使用超出鍵盤本身高度的任何效果(也就是說你的按鍵「按下去」的效果不可以高於鍵盤本身)
但是就是會有使用者期望有這些功能,然後發現你沒有,就給你打一星評論(丟筆)。
如果你看到這邊還沒退縮的話,恭喜你已經邁向成功的道路了...
讓我們來看看官方提供哪些API吧...
來看一下 UIKeyInput 這個 class 的官方文件。
- - insertText:
- - deleteBackward
- - hasText
其中 insertText 後面接 NSString 大家都會,
deleteBackward 就刪除字嘛,
hasText 就是檢查有沒有輸入內容而已,就這樣,超精簡,超棒的...
然後你應該會想要看一下 UITextInputTraits,
裏面有提供
- keyboardAppearance
- keyboardType
- returnKeyType
這三個東西還滿常用的,而且對於外觀設計來說算重要,
其他項目我想應該不太會用到。
再看到 UIInputViewController,這裡就是鍵盤主要的 View Controller 了
主要提供有
- - advanceToNextInputMode
- - dismissKeyboard
跟一個 textDocumentProxy,底下會提到。
advanceToNextInputMode 這個是每個鍵盤必須做的,沒作絕對不會過審核。
dismissKeyboard 就不一定,可以隨性,但一般 iPad 會作,
iPhone 6/6 plus 橫向模式內建也有作,但沒做也不會怎樣的樣子。
最後看到 UITextDocumentProxy,
他也就是 UIInputViewController 的 textDocumentProxy 的類別
提供的 API 有三個,前面兩個是:
- documentContextAfterInput
- documentContextBeforeInput
這兩個是讓你抓游標前後大概十幾個字用的,
英文的話大概抓三到四個「單字」左右就差不多了
而這個 method
- - adjustTextPositionByCharacterOffset:
是我覺得 iOS 8 鍵盤API裏面最有誠意的API,這個東西可以讓你左右移動游標,超棒的
所以 iKeywi 才能做出類似 Swipe 移動游標的功能。
當你經過千辛萬苦,寫了第一個測試鍵盤,
可以輸出文字,而感到激動莫名的時候,
最後回來看看一些需要注意的的細節吧!
一、一定要用 Autolayout ,但是小心會卡
因為鍵盤內分辨直向,橫向螢幕的 API 很奇怪,很多方法都不能用
所以你會想要用 autolayout,但是要注意用太多 autolayout 會卡卡的,
請不要在那邊用模擬器或 iPhone 6 寫的很開心,
一定要去弄一台 iPhone 4s 或 iPod touch 5 來測試,加上一台 iPad 2 或 iPad 3代
如果這兩台可以順暢,那才有使用的價值,
否則你的鍵盤就卡卡,跳針,但再怎麼跳針你也不會變姐姐,只會得到一堆一星。
二、要同時作 iPhone (3.5、4.0、4.7、5.5)跟 iPad 的尺寸。
因為沒有辦法讓特定裝置的使用者無法安裝你的App,所以一定要符合全尺寸,
而且要 Universal ,container app,也就是安裝的 App 本身貌似沒有硬性規定,
但是鍵盤本體一定要在各種尺寸都能正常使用。
不然照理說無法上架(有些寫的會layout爛掉的我懷疑Apple到底有沒有認真審核)
三、請反覆測試不同 App 下是否正常運作。
例如你在 iPhone 6 Plus 上面先開 Facebook 或者任何一個尚未對 iPhone 6/6 Plus 作優化的 App
(也就是按下去介面會變大的App),然後轉橫向鍵盤,再開 Safari,轉橫向鍵盤
看 layout 會不會炸掉,會的話就是 layout 沒寫好,
但這個好像 Apple 不是很在意,一堆上 feature 的鍵盤都會炸掉。
同理,在 iPad 先開 Safari,再開只有 iPhone only 的 App,
看 layout 會不會炸掉,也是需要檢測的部分。
例如下圖就是一個著名廠商鍵盤爛掉的例子:
另外,有些 App 貌似本身有問題,建議跟其他廠商比較一下,有時候 layout 爛掉不是你的錯。
例如 iPhone4.TW 的「美麗新世界」App,在 iPhone 6/6 plus 的橫向第三方鍵盤都是爛掉的,
這個應該是 App 本身的問題,就不管他這樣。
四、有些錯不在你,都是 Apple 的錯!
例如在 AppStore 的「評論」開第三方鍵盤會造成星星無法按,
這在 iOS 8.1 還沒修好(iOS 8.1 又捅了幾個 bug 就不提了),然後使用者就會因為這樣給你一星。
又例如因為有些時候要重開 App 才會套用新的第三方鍵盤,但是 Springboard 正常情況不會重開
所以在 Spotlight 有時候就會因為這樣不能用,恭喜又得到一星...
再例如 iOS 8.0.x 會有鍵盤有時候叫不出來的bug,再得到一個一星...
喔對了,因為 UIInputViewController 不是正宗 UIKeyboard 或 UIKBTree 的類別,
所以切換的時候系統會慢一些,然後如果你又改過鍵盤高度又會閃一下,然後就繼續一星...
五、能不要用設定就盡量不要用
因為鍵盤「App」跟「鍵盤本身」是兩個不同的東西,所以不在同一個 sandbox 下,
要讀取設定(或任何在「鍵盤App」共享的東西),
必須用到「AppGroup」,且要使用者「允許完整取用」(Allow Full Access)
那這個「允許完整取用」呢,因為在開啓的時候會寫:
「完整取用允許此鍵盤的開發人員傳送您輸入的任何文字...(下略)」
然後就會有使用者給你一星...說什麼要使用鍵盤必須讓開發者看到他輸入的任何內容。
我才對你輸入什麼沒興趣咧,只是 Apple 不給我直接讀設定才只能這樣作...我也不想啊...
如果看完以上全部,你還想踏入這個坑的話,歡迎歡迎...
想必您有這樣的毅力,即使不做鍵盤作其他的東西也會很成功。
我自己個人感想是,如果我早點知道這些,我寧願乖乖作 JB 的,
需要的時間只要三分之一,賣價貴一倍照樣爽爽賣,問題還更少,評價還更好...
寫到最後好像變成抱怨文了,不過說真的如果您有意願跳入此坑,還是早點面對這些現實比較好的...
發佈留言