DMG的SLA文件

今天遇到一个问题就是我们项目的SDK文件,DMG在Mac上打开后不再显示 软件协议声明 SLA Software License Agreement,而是直接打开了虚拟硬盘,而同样的DMG文件在旧的Mac系统上是正常的。

为了搞定这个奇怪的问题花了不少时间,记录一下踩过的坑,防止下次再踩:

我们使用的是脚本产生DMG的方式,在设定SLA的时候,是通过脚本语言"flatten" DMG文件的形式来添加的:

hdiutil unflatten your_image_file.dmg
Rez -a /tmp/sla.r -o your_image_file.dmg
hdiutil flatten your_image_file.dmg

这里的关键是SLA的文件,而碰到的问题就出在此。

我们通过苹果提供的SLA生成工具可以得到一个默认的SLA文件,苹果的这个工具已经很老了,可以通过这个地址slas_for_udifs_1.0.dmg下载。打开它可以得到一个Instruction文件和SLAResources文件,通过如下命令可以生成默认SLA文件:

cd /Volumes/SLAs_for_UDIFs_1.0
DeRez SLAResources > /tmp/sla.r

打开SLA文件,你会看到这是一个包含了多种语言的脚本,我们可以删除其他的语言支持,只留下英文版本如下:

data 'TMPL' (128, "LPic") {
    ...
};

data 'LPic' (5000) {
    ...
};

data 'STR#' (5000, "English buttons") {
    ...
};

data 'TEXT' (5000, "English SLA") {
    ...
};

data 'styl' (5000, "English SLA") {
    ...
};

这里需要修改的包括"TEXT"列,这里直接输入英文版的版权信息内容即可,使用双引号包含信息内容。另外需要修改的是"STR#"即定制按钮信息:

data 'STR#' (5000, "English buttons") {
    $"0006 0D45 6E67 6C69 7368 2074 6573 7431"            /* ...English test1 */
    $"0541 6772 6565 0844 6973 6167 7265 6505"            /* .Agree.Disagree. */
    $"5072 696E 7407 5361 7665 2E2E 2E7A 4966"            /* Print.Save...zIf */
    $"2079 6F75 2061 6772 6565 2077 6974 6820"            /*  you agree with  */
    $"7468 6520 7465 726D 7320 6F66 2074 6869"            /* the terms of thi */
    $"7320 6C69 6365 6E73 652C 2063 6C69 636B"            /* s license, click */
    $"2022 4167 7265 6522 2074 6F20 6163 6365"            /*  "Agree" to acce */
    $"7373 2074 6865 2073 6F66 7477 6172 652E"            /* ss the software. */
    $"2020 4966 2079 6F75 2064 6F20 6E6F 7420"            /*   If you do not  */
    $"6167 7265 652C 2070 7265 7373 2022 4469"            /* agree, press "Di */
    $"7361 6772 6565 2E22"                                /* sagree." */
};

这是默认的展示信息,包括了版权信息页面上四个按钮以及左边提示的信息。这里添加的方式略有不同,你会看到这个示例是全编码的,事实上是字符的十六进制形式,每两个代表一个字符,另外会在起始处加一个16进制码代表这个字段的长度以便分割不同的按钮和提示信息。

比如对于"English",我们首先加上"07"代表这个字段长度为七,然后查找Convert hexadecimal to text,加上各个字符的16进制代码,最终为"07 45 6e 67 6c 69 73 68"即代表这个单词。另外起始"0006"为预留,不作变更。

而我们这个问题的根源就在于当前版本没有遵循这种写法,而是采取了如下的形式,而新版本OS系统对此解读出现了问题:

data 'STR#' (5000, "English") {
    $"0006"
    $"07" "English"
    $"05" "Agree"
    $"08" "Disagree"
    $"06" "Print…"
    $"05" "Save…"
    $"B7" "Important — Read this license agreement carefully before clicking on the Agree button. By clicking on the Agree button, you agree to be bound by the terms of the license agreement."
};

我这里只需要英文版本的版权信息,如果需要支持多语言版本,可以参见如下引用的文章。

20180118 "license.r"文件中"SLA"部分是格式,可以删除仅用默认格式,比如最上面截图中标题最后两个粗体就是这个造成的。

引用

Adding license to a DMG file in 5 minutes or less

如何给DMG文件加上软件协议声明

推荐阅读更多精彩内容