我正在开发一款Unity3D游戏,该游戏根据用户本地语言在iPhone主屏幕中显示不同的(本地化)应用名称。请注意:
我已经知道如何通过编辑Xcode项目来本地化iOS应用程序名称(创建InfoPlist.string
文件,本地化,添加CFBundleDisplayName
密钥等)。
我也知道如何自动在Unity编辑器中本地化Android应用名称(将values-XX.xml
文件与app_name
属性添加到Assets/Plugins/Android/res/
文件夹等。)
问题是:如何自动在 Unity编辑器中本地化 iOS 应用名称,这样我就无需执行每次构建项目时,容易出错的任务 1。?
我认为PostprocessBuildPlayer
应该是可行的方法,但是我没有找到任何关于如何解析它和/或正确修改Xcode项目文件以实现此目的的文档。
答案 0 :(得分:1)
很久以前,当我尝试通过Build Player Pipeline修改info.plist时遇到了麻烦,尤其是在追加模式中进行修改时。它仅工作一次,然后后续构建失败,“无法读取数据,因为它的格式不正确。”(s。Unity论坛帖子,如this one和我的blog posting关于这个问题)所以我决定采用另一种方式将自定义构建与Xcode Build Pre-action相结合。
需要三个步骤:
在Xcode中,转到编辑方案/构建/预操作。然后单击+号以添加新运行脚本操作。
. ${PROJECT_DIR}/modify_info_plist.sh
(注意开头的点和空白,确保脚本在调用者的shell中执行)所以看起来应该是这样的:
在您的脚本中,您可以访问Xcode中的所有环境变量(s。Xcode Build Setting Reference),您可以使用defaults
命令(man page)操作Info.plist。以下是我用gyroscope
添加UIRequiredDeviceCapabilities
的示例:
# Code snippet used in Unity-iPhone scheme as "Build Pre-Action"
my_domain=${PROJECT_DIR}/Info.plist
status_bar_key=UIViewControllerBasedStatusBarAppearance
logger "Start adding keys to info.plist"
defaults write $my_domain $status_bar_key -boolean NO
if [ `defaults read $my_domain UIRequiredDeviceCapabilities | grep "gyroscope" | wc -l` = "0" ]; then
defaults write $my_domain UIRequiredDeviceCapabilities -array-add "gyroscope"
fi
logger "Keys added to info.plist successfully"
将以下代码放在静态编辑器类中,以创建一个新菜单项Tools / My iOS Build,快捷键为 cmd + alt + b :
static string IOSBuildDir= "Develop";
[MenuItem("Tools/My iOS Build %&b")]
public static void IOSBuild () {
string[] levels = { "Assets/Scenes/Boot.unity",
"Assets/Scenes/Level-1.unity",
// ...
"Assets/Scenes/Menu.unity"
};
string path = Directory.GetCurrentDirectory ();
path += "/" + IOSBuildDir + "/Info.plist";
if (File.Exists (path)) {
Debug.Log ("Removing file " + path);
File.Delete (path);
}
BuildPipeline.BuildPlayer (levels, "Develop", BuildTarget.iPhone,
BuildOptions.AcceptExternalModificationsToPlayer);
}
我知道这不是完美的解决方案,但它是我发现的唯一稳定工作的解决方案。两个缺点: