iOS 8 第三方鍵盤開發前必須知道一些事

因為 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 的,

需要的時間只要三分之一,賣價貴一倍照樣爽爽賣,問題還更少,評價還更好...

寫到最後好像變成抱怨文了,不過說真的如果您有意願跳入此坑,還是早點面對這些現實比較好的...

16 則留言

  1. 「Simon」的個人頭像
    Simon

    哈哈哈…辛苦了…真的是莫名其妙就得到一堆一星的成就…

  2. 「Haze」的個人頭像
    Haze

    辛苦了~這個鍵盤我一直都在用,現在iPhone 6也買了。可是不知從甚麼時候開始我自訂的按鍵都沒有生效,一直都留在預設的按鍵。

    1. 「皮樂」的個人頭像
      皮樂

      請你關閉再打開「允許完整取用」,如果不行的話按重置設定(在 iKeywi 內)

  3. 「Clare」的個人頭像
    Clare

    一星集滿五個,可以換五星

  4. 「OrdinaryGeek」的個人頭像

    其實按鍵聲可以調用內建的,和內建英文鍵盤一模一樣,音量也一樣喔

  5. 「J」的個人頭像
    J

    皮樂姐姐 你好,
    因為Apple特別寫了
    「完整取用允許此鍵盤的開發人員傳送您輸入的任何文字…(下略)」
    這點我一直覺得很疑惑,
    原本想說官方開放第三方鍵盤功能後,能保障可能被蒐集輸入文字的風險。
    結果居然註明了這項,讓使用者感到不安全。
    就您的了解,開發者能蒐集/上傳使用者輸入文字,在「技術上」究竟能否作到?
    就算技術上能作到,能通過Apple的審核嗎?
    Apple這麼寫,是否只是為官方打預防針?
    避免哪天因為漏洞真的被蒐集而設的官方防火牆?
    我一直很想知道這個答案,甚至想打電話諮詢去問…
    希望皮樂姐姐能幫忙解惑,感謝~
    也為所有第三方鍵盤開發者,加油!!! 太偉大了~

    1. 「皮樂」的個人頭像
      皮樂

      技術上可行,繞過 Apple 審核又是另外一回事了,基本上沒過審核的東西你就算一個字不改重新丟上去,還是會有機會通過

  6. 「Ethan」的個人頭像
    Ethan

    皮樂姐您好,

    謝謝您分享這麼棒的第三方鍵盤開發文章。

    想請教一個第三方鍵盤問題,不知您是否有試過增加鍵盤高度超過220px,

    我試了 Apple 開發文件內寫的調整NSLayoutConstraint方式,似乎無效。
    https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/Keyboard.html

    因為 iPhone6 寬度變了,導致鍵盤比例也變了,非常不習慣。

    所以想嘗試在不設定變大模式下,讓鍵盤維持跟原先4吋機的同樣高度與Layout。

  7. 「皮樂」的個人頭像
    皮樂

    可以超過 220px,我也是用官方文件的,但是有稍微調整一下 priority,還有先移除原本的 height constraint,
    如果你無效可能是因為兩個 constraint 衝突,試著改變優先度,或者刪除其中一個就會解決


    [self.view removeConstraint:_heightConstraint];
    _heightConstraint =
    [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeHeight
    relatedBy:NSLayoutRelationEqual
    toItem:nil attribute:NSLayoutAttributeNotAnAttribute
    multiplier:0.0 constant:height];
    [_heightConstraint setPriority:UILayoutPriorityDefaultHigh];
    [self.view addConstraint: _heightConstraint];

  8. 「Tina」的個人頭像
    Tina

    皮樂姐您好,
    謝謝你分享這麼棒的文章。
    想請教你按鍵聲,播放聲音可否推到背景執行呢?

    1. 「皮樂」的個人頭像
      皮樂

      為什麼會要推到背景執行?在沒打字的時候應該不會有聲音才對,不過我想應該是不行的,鍵盤的權限很嚴格

  9. 「Tina」的個人頭像
    Tina

    皮樂姐您好,我想要檢查使用者是否允許完整取用。這我應該怎麼做?

    1. 「皮樂」的個人頭像
      皮樂

      對 container app 的檔案做存取,例如我就是把設定檔案放在 container app 裡面,如果存取不到就是沒有開啟完整取用了

  10. 「Tina」的個人頭像
    Tina

    皮樂姐您好,想請問上架憑證是不是需要申請 container app 和 extension app 兩個 distribution profile ??

    上架的 app groups 需要在設定其他方面的東西嗎?
    或是有分上架或是開發用的嗎?

    1. 「皮樂」的個人頭像
      皮樂

      按照 Xcode 的設定走,他都會幫你處理好,上架憑證我沒有太管他,反正送審前會自動跑驗證,驗證有過就不必調整

      group 不用另外設定,開發到上架一條龍(同一個ID)

  11. 「HaoChange」的個人頭像
    HaoChange

    請問皮樂姐是否有在開放內建遮蔽注音tweak IOS8?

    以前還蠻習慣用的,有點懷念?

發佈留言