iOSでホーム画面に表示されるアプリ名はどこで決まるのか?変更するにはどうすればよいか?を整理してまとめました。
確認環境
- Xcode 11.3.1
- iOS 13.3
結論
- アプリ名は Info.plist ファイルの CFBundleDisplayName で決まる
- アプリ名を変更するには、その CFBundleDisplayName の値を変更すればよい
- アプリ名をローカライズするには、対象言語毎に InfoPlist.strings を用意する
- Build Configuration に応じてアプリ名を切り替えるには、 User-Defined Setting を使うと良い
- Build Configuration に応じてアプリ名を切り替えつつローカライズするには、ビルド時にがんばるしかなさそう
ホーム画面のアプリ名はどこで決まるのか?
新規プロジェクトを作成して確認していく。
プロジェクト作成時に Product Name を入力する。
以下が先ほど入力した Product Name になっていることがわかる。
- プロジェクトファイル名
- ターゲット名
- ターゲット設定の General タブにある Display Name
このうち、最後の Display Name がホーム画面に表示されるアプリ名となる。
アプリ名を変更するには?
この Display Name を変更してみると、プロジェクトファイルの PRODUCT_NAME
が変わる。また、変更前の PRODUCT_NAME
はターゲット名 TARGET_NAME
であったこと、そして PRODUCT_NAME
がアプリケーションファイル (.app) 名になることがわかる。
アプリケーションファイル名が変わるのは気持ち悪いので PRODUCT_NAME
を変更しないようにしたい。そんな時のために Bundle display name という設定がある。これはターゲット設定の Info タブで追加できるので、追加してアプリ名を入力してみる。
General タブの Display Name は入力した名前に変わった。ホーム画面上でも変わっている。
その正体は Info.plist ファイルの CFBundleDisplayName キー。公式ドキュメントにも ホーム画面で表示される名前 という説明がある。
The user-visible name for the bundle, used by Siri and visible on the iOS Home screen.
アプリ名をローカライズするには?
アプリ名は Info.plist の CFBundleDisplayName で決まるので、これをローカライズしたい。その方法は公式ドキュメント About Information Property List Files の Localizing Property List Values という章で説明されているとおり、InfoPlist.strings という Info.plist 国際化用の strings リソースファイルを用意する。
Localized values are not stored in the Info.plist file itself. Instead, you store the values for a particular localization in a strings file with the name InfoPlist.strings.
InfoPlist.strings ファイルの作成方法、記述方法、言語別に用意する方法は、通常の文字列リソースファイルをローカライズする場合と同様。プロジェクト設定でローカライズ対象言語を設定する。
InfoPlist.strings ファイルをプロジェクトに追加する。
言語別に CFBundleDisplayName を設定する。
Build Configuration に応じてアプリ名を切り替えるには?
ターゲット設定の Build Settings タブにある設定項目は Build Configulation (Debug, Releaseなど) ごとに値を変更できる。ここには User-Defined というユーザー定義の設定を追加することができる。
ここに、例えば BUNDLE_DISPLAY_NAME
のようなキーを追加し、Build Configuration ごとにアプリ名となる値を入力する。
そして、Info.plist の Bundle display name の部分に、先ほどの BUNDLE_DISPLAY_NAME
を参照させる。
General タブの Display Name は、Run を実行する Build Configuration のものが表示されている。
Build Configuration に応じてアプリ名を切り替えつつローカライズするには?
上記の手段では、最終的に InfoPlist.strings の方のアプリ名が優先されてしまい、両立することができない。Xcode に用意されている仕組みでは、これを両立する手段はなさそう。
ただ、開発の要件上、このような対応が必要になったため、次のようにして力技で対応してみた。
まず、全言語の InfoPlist.strings に対して、CFBundleDisplayName_{Build Configuration}
というキーで、Build Configuration ごとにアプリ名を定義する。
"CFBundleDisplayName_Debug" = "HogeDebug";
"CFBundleDisplayName_Release" = "HogeRelease";
"CFBundleDisplayName_Debug" = "ほげデバッグ";
"CFBundleDisplayName_Release" = "ほげリリース";
そして Build Phases の Run Script で全言語の InfoPlist.strings に対して、ビルド対象の Build Configuration に該当する CFBundleDisplayName_{Build Configuration}
を CFBundleDisplayName
に置換する。例えば Release の場合は ``CFBundleDisplayName_Release` が置換対象となる。
sed -i "s/\"CFBundleDisplayName_$CONFIGURATION\"/\"CFBundleDisplayName\"/" path/to/InfoPlist.strings
"CFBundleDisplayName_Debug" = "HogeDebug";
"CFBundleDisplayName" = "HogeRelease";
"CFBundleDisplayName_Debug" = "ほげデバッグ";
"CFBundleDisplayName" = "ほげリリース";