Long time ago,我在尝试通过Build Player Pipeline修改info.plist时遇到了麻烦,特别是在
Append mode中进行操作。它只能工作一次,然后随后的构建将失败,并显示“
The data couldn’t be read because it isn’t in the correct format.”(请参见Unity论坛帖子
this one和我的
博客文章)。因此,我决定采用另一种方法,即使用自定义构建与Xcode Build Pre-action相结合。
需要三个步骤:
(1) Xcode设置:
在Xcode中,转到Edit Scheme / Build / Pre-actions。然后单击+号添加New Run Script Action。
- 在提供构建设置中选择Unity-iPhone。
- 粘贴
. ${PROJECT_DIR}/modify_info_plist.sh
(注意开头的句点和空格,这可以确保脚本在调用者的shell中执行)
所以它应该看起来像这样:
![Xcode screenshot](https://istack.dev59.com/37xH5.webp)
(2) 脚本 modify_info_plist.sh:
在您的脚本内,您可以访问所有来自 Xcode 的环境变量 (请参见 Xcode 构建设置参考),并且您可以使用 defaults
命令(手册页面)来操作 Info.plist。下面是我用来将 gyroscope
添加到 UIRequiredDeviceCapabilities
的示例:
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"
(3) 构建流程:
将以下代码放入静态编辑器类中,创建一个新的菜单项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);
}
我知道这不是完美的解决方案,但它是我发现的唯一稳定工作的方法。有两个缺点:
- 在主要的Xcode格式更改后必须重复步骤(1)
- 新场景必须追加到编辑器类代码中的步骤(3)