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側で修正されても大きな害はないので大丈夫かなと思います。