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

时间:2016-09-03 18:23:00

标签: 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>

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

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

2 个答案:

答案 0 :(得分:7)

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

在顶部&#34; .cosx_version_min&#34;是问题。要更改此嵌入式版本号,您只需设置编译器标志:

$ 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,版本号已修复。

答案 1 :(得分:0)

当我自己遇到这个问题时,以供参考:

确定Xcode实际上使用了哪个-mmacosx-version-min标志,在Xcode中构建项目,然后切换到“构建报告导航器”。单击报告的最新版本,然后单击任何条目“ Compile xxx.m”,然后展开该条目。

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

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

如果使用框架,则这些框架也可能使用了错误的部署目标。相同的解决方案对我有用。

相关问题