【问题标题】:Mac .app package backwards compatibility error: "You can't use this version of the application "[my app name]" with this version of OS X."Mac .app 包向后兼容错误:“您不能将此版本的应用程序“[我的应用程序名称]”与此版本的 OS X 一起使用。”
【发布时间】:2017-01-11 14:43:31
【问题描述】:

我正在开发一款跨平台游戏,该游戏将通过 Steam 发布和分发,但我在 Mac 版本上遇到了问题。一切都是用 C++ 编写的,并使用 CMake 生成的项目文件在 El Capitan 上使用 Xcode 构建,其中包含一些小的修改。构建完成后,我使用自己的构建脚本将 .app 包放在一起,生成目录结构,添加图标文件和二进制文件,以及我自己编写的 Info.plist 文件我可以找到关于哪些元素是必要的文档。

问题在于向后兼容性。当我尝试在运行 Yosemite 的 Mac 上启动游戏 .app 时,我收到以下错误消息:

您不能在此版本的 OS X 上使用此版本的应用程序“[my app name]”。您使用的是 OS X 10.10.5。该应用程序需要 OS X 10.11 或更高版本。

问题是,在 Xcode 中,我将构建目标指定为 OS X 10.7,所以我对为什么会发生此错误感到困惑。我什至可以进入 Finder 中的包,导航到实际的游戏二进制文件,然后毫无问题地运行它。当我双击 .app 文件(其图标显示带有斜线的圆圈,表明我可能在 Info.plists 或包配置中做错了什么)时,它只会失败并显示此错误消息。在 El Capitan 上运行时一切正常。

我也尝试过适当地设置LSMinimumSystemVersion,但这并不能解决问题。

这是我的Info.plist 文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>Contents/MacOS/[binary name]</string>
    <key>CFBundleDisplayName</key>
    <string>[game title]</string>
    <key>CFBundleIconFile</key>
    <string>[icon file]</string>
</dict>
</plist>

我认为 Info.plist 中缺少某些内容,但 Apple 关于所需密钥的文档对于弄清楚可能是什么并没有帮助。

如果您需要更多信息来解决这个问题,请告诉我,非常感谢您的帮助!

【问题讨论】:

  • @dorukayhan 这有什么帮助?我正在尝试构建以实现向后兼容性。
  • 我遇到了同样的问题,除了使用 go 二进制文件而不是 C++。直接执行时二进制运行良好,但是通过 .app 包执行时,我得到相同的错误(版本不同除外)。我尝试在 Info.plist 中设置各种版本密钥,以及使用 386 和 amd64 代码构建“胖”二进制文件。
  • 你是如何尝试设置LSMinimumSystemVersion的?此外(可能不相关),CFBundleExecutable 不应包含路径,而应包含可执行文件的名称。假定它位于 Contents/MacOS 中。您应该在 Xcode 中创建一个新项目并检查为其创建的 Info.plist。尝试将所有这些键添加到您的 Info.plist 中,除非您已验证任何给定的键是不必要的。

标签: macos backwards-compatibility


【解决方案1】:

所以问题似乎是在输出二进制文件的数据部分中设置了最低 mac 版本。二进制文件在直接运行而不是通过 .app 运行时执行的原因是,当使用 .app 运行时,它实际上是 LaunchServices 执行二进制文件,它检查嵌入到二进制文件中的版本号。以下是 clang 的汇编输出示例:

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 12
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    xorl    %eax, %eax
    movl    $0, -4(%rbp)
    movl    %edi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    popq    %rbp
    retq
    .cfi_endproc


.subsections_via_symbols

就在顶部“.macosx_version_min”是问题所在。要更改此嵌入式版本号,您只需设置编译器标志:

$ gcc -mmacosx-version-min=10.7 -S -o main.S main.c

现在当我们查看输出程序集时:

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 7
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    xorl    %eax, %eax
    movl    $0, -4(%rbp)
    movl    %edi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    popq    %rbp
    retq
    .cfi_endproc


.subsections_via_symbols

Boom,版本号已修复。

【讨论】:

  • 这是我在另一个帮助论坛中询问后找到的解决方案。我可以确认它有效。 :)
【解决方案2】:

仅供参考,因为我自己也遇到了这个问题:

确定哪个-mmacosx-version-min 标志真正被 Xcode 使用,在 Xcode 中构建您的项目,然后切换到 Build Report Navigator。单击最后一次构建的报告和任何条目“Compile xxx.m”,然后展开条目。

您将在此处找到用于构建该文件的完整命令以及所有命令行标志。按 Cmd-F 并搜索“mmacosx-version-min”。

在我的情况下,解决方法是在 项目级别 构建设置明确指定部署目标。它的值为“default”,使用当前系统版本。

如果您使用框架,那么它们也可能使用了错误的部署目标。同样的解决方案对我有用。

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多