很久以前,当我尝试通过构建播放器管道修改 info.plist 时遇到了麻烦,尤其是在 追加模式 中进行修改时。它只工作一次,然后后续构建失败,并显示“无法读取数据,因为它的格式不正确。”(s. Unity 论坛帖子,如 this one 和我的 @987654322 @关于这个问题)所以我决定采用将自定义构建与 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中执行)
所以它应该是这样的:
(2) 脚本 modify_info_plist.sh:
在您的脚本中,您可以从 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"
(3) 构建管道:
将以下代码放入静态编辑器类中以使用快捷方式 cmd+alt+b创建新菜单项 Tools / My iOS Build >:
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)的编辑器类代码中附加新场景