ビルドしたアプリが iPhone 実機でローカライズされない - Xcode4
SPECIAL
Xcode4 でビルドしていたアプリが iPhone で突然ローカライズされなくなる
Xcode4 で iPhone アプリを制作していたときのこと、つい先ほどまで正しく動作していたアプリが、何かの拍子に実行できなくなってしまいました。
iPhone 実機では MainWindow の viewDidLoad メソッドが呼ばれる前あたりで NIB ファイルが読み込めないという例外エラー ("Could not load NIB in bundle") が発生してしまいました。そして iPhone シミュレーターでは、自作のスタティックライブラリから読み込んでいるメソッドが実装されていないとのことで実行時エラーとなってしまいました。
原因を探っていってみる
それといって大きな変更もしていなかったため、これほどおおごとなエラーに繋がる心当たりがないながらも、とりあえずアプリ自身やスタティックライブラリを何度かクリーンビルドしていたところ、いつの間にかシミュレーターでのエラーは解消されました。
ただし iPhone 実機での実行の方は、依然として NIB が読み込めずに致命的なエラーとなってしまうままでした。
状況を調べていったところ、どうやら NSLocalizedString によるローカライズが効かなくなっているようでした。
以前にも 文字列の一部がローカライズされなくなる でお話したように、突然ローカライズができなくなることはありましたけど、今回はどうやらすべて、英語も日本語も、ローカライズが効かなくなっているような感じがします。
以前のローカライズ問題では、単純に "Localizable.strings" ファイル内の記述の問題だったので、影響もその範囲に収まっている感じでしたけど、今回はほかの "InfoPlist.strings" といったローカライズファイルも効かなくなっていました。
同じように NIB についても、どうやらローカライズされたデータが読み取れなくなっているために、今回の "Could not load NIB in bundle" エラーが発生してしまっているようです。
それで浮上した心当たりとしては、つい先ほど実験としてファイルを作成してローカライズしてそれを削除したことと、その時に間違ってどこか別のファイルでローカライズ設定を追加してしまい、すぐに削除したというところでしょうか。
念のため、間違ってローカライズしたファイルを確認してみても、これは元の状態に戻っているようでした。
次にファインダーで、実験に使用したローカライズファイルを確認してみたところ、何故か "ja.lproj" フォルダーにだけそのファイルが残されていて、"en.lproj" は存在していない状態でした。そこで、手作業で、不要になった "ja.lproj" フォルダー内のファイルを削除してみましたけど、それでも問題が解消されることはありませんでした。
もう一つ気になったのが、今回のローカライズファイルが "ja.lproj" に残されていたところです。
今回の Xcode プロジェクトは、以前の Xcode3 で作成していたプロジェクトで、その時は、ローカライズファイルは "English.lproj" と "Japanese.lproj" に保存されていた様子です。
それが Xcode4 に移行した際に、Xcode4 で新規作成したプロジェクトで作成したローカライズファイルは "en.lproj" と "ja.lproj" とに保存されるようでしたけど、Xcode3 から使用していたこのプロジェクトでは、引き続き、"English.lproj" と "Japanese.lproj" とでローカライズを使用することができていました。
今回 "ja.lproj" というフォルダーが出来上がっているところを見ると、もしかして、Xcode4 でローカライズ関係の操作を行ったタイミングで、Xcode プロジェクトが見るローカライズフォルダーの場所が "English.lproj" から "en.lproj" に、"Japanese.lproj" から "ja.lproj" に変更になってしまったのかもしれません。
ローカライズの問題を解消する
それならと、ローカライズされたファイルが保存されている各フォルダーにある "English.lproj" フォルダーの名前を "en.lproj" に変更し、"Japanese.lproj" フォルダーの名前を "ja.lproj" に変更してみることにしました。
その上で、"プロジェクト名.xcodeproj/project.pbxproj" ファイルの中身を編集して、"Japanese.lproj" という箇所を "ja.lproj" に変更し、"English.lproj" という箇所を "en.lproj" に変更します。
このように調整したら、Xcode4 でプロジェクトを開き直してビルドをし直してみたところ、iPhone 実機でもローカライズファイルが正しく読み込めるようになり、"Could not load NIB in bundle" というエラーも発生しなくなりました。