Mac .app包向后兼容性错误:"您不能在此版本的OS X中使用此版本的应用程序"[我的应用程序名称]".

Nat*_*n64 4 macos backwards-compatibility

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

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

您不能在此版本的OS X中使用此版本的应用程序"[我的应用程序名称]".您有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>
Run Code Online (Sandbox Code Playgroud)

我想象Info.plist中缺少一些东西,但Apple的所需密钥文档在找出可能的内容方面没有帮助.

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

Ron*_*n E 8

所以问题似乎是在输出二进制文件的数据部分设置最小的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
Run Code Online (Sandbox Code Playgroud)

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

$ gcc -mmacosx-version-min=10.7 -S -o main.S main.c
Run Code Online (Sandbox Code Playgroud)

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

    .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
Run Code Online (Sandbox Code Playgroud)

繁荣,版本号固定.