iOS 4.2.1の日本語テンキー(フリックキーボード)の不具合をコードで回避する方法
iOS 4.2の日本語フリックキーボードに不具合があり、アプリが落ちます。でご紹介しましたが、iOS 4.2.1では日本語テンキーを使用した場合、パスワード入力に不具合があります。
これは2010年11月末にApple Bug Reportに報告していますし、Appleのエンジニアの方からもご連絡をいただいたので、おそらくiOSの次のバージョンで修正されることが期待されます。
今回はパスワード管理アプリIDBoxでどのように回避したかご質問をいただいたので、みなさんに共有します。
この問題は、gdbのバックとレースとクラッシュログを見る限り、iOSが用意したフレームワークにおいてUIKeyboardのベースクラスで落ちているように見えます。
IDBoxはパスワード管理アプリで、1つのマスターパスワードでいろんなパスワードをiPhoneに記憶しておくことができます。マスターパスワードを入力し、あらかじめ設定したマスターパスワードと一致すると、ID一覧画面(UITableView)が表示されますが、その処理は以下の通りです。
if ( [myTextField.text isEqual:mySettings.masterPassword] ) { // パスワードが一致していたときの処理 [self dismissModalViewControllerAnimated:YES]; // マスターパスワード入力画面を消す
このdismissModalViewControllerAnimated:メソッドの中で落ちてしまいます。かなり悩んだのですが、
secureTextEntry=NOの場合、前のアプリで使用したキーボードが引き継がれるけど、secureTextEntry=YESにした場合、常に英語キーボードが表示されることに気がつきました。
よってiOSのフレームワーク内で別のオブジェクト、つまりパスワード入力用キーボードのオブジェクトではなく、前回使っていた日本語フリックキーボードのオブジェクトを触っているのではないかと仮定し、それを強引に戻すという方法でコード回避しました。
コードはこんな感じです。
if ( [myTextField.text isEqual:mySettings.masterPassword] ) { // パスワードが一致していたときの処理 // 以下の3行はiOS 4.2の日本語フリックキーボードのバグ対応です。 [myTextField resignFirstResponder]; myTextField.secureTextEntry = NO; [myTextField becomeFirstResponder]; [self dismissModalViewControllerAnimated:YES];
ホントかっこわるいのですが、仮にiOS側で修正されても大きな害はないので大丈夫かなと思います。