如何使用 xcode5 在 Mac 应用程序中对捆绑的可执行文件进行代码签名

Posted

技术标签:

【中文标题】如何使用 xcode5 在 Mac 应用程序中对捆绑的可执行文件进行代码签名【英文标题】:How can I code sign a bundled executable file in a mac app using xcode5 【发布时间】:2013-12-31 11:45:27 【问题描述】:

我在 xCode 5 中创建了一个应用程序,其中包括一个捆绑的可执行文件。我正在尝试将应用程序提交到 Mac App Store,但是当我提交它时失败并显示以下消息:

未启用应用沙盒 - 以下可执行文件必须在权利属性列表中包含布尔值为 true 的“com.apple.security.app-sandbox”权利。有关对您的应用进行沙盒处理的更多信息,请参阅应用沙盒页面。

我创建了一个权利文件 (EXECUTABLE_NAME.entitlements),其中包含值为 'true' 的 'com.apple.security.app-sandbox' 键...

<?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>com.apple.security.app-sandbox</key>
        <true/>
    </dict>
</plist>

...但应用仍然失败。

我遗漏了什么(或者我做错了什么)来签署捆绑的可执行文件代码?

【问题讨论】:

【参考方案1】:

我通过以下方式解决了这个问题:

1) .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>com.apple.security.app-sandbox</key>
        <true/>
        <key>com.apple.security.inherit</key>
        <true/>
    </dict>
</plist>

这本身不会完成这项工作,要对文件进行实际代码签名,我做了以下操作:

    归档应用 打开 xCode 的管理器窗口 右键单击存档并选择“在 Finder 中显示”以获取其位置 使用 Terminal.app,导航到其位置,然后在应用程序内部 捆绑/内容/资源/

    运行以下命令:

    codesign -f -s "$YOUR_CERTIFICATE_HERE" --entitlements "$THE_ENTITLEMENTS_PLIST" "$THE_EXECUTABLE"

$YOUR_CERTIFICATE_HERE 使用您的第 3 方 Mac 开发者应用程序证书

完成此操作后,应用程序应上传到 iTunes Connect,您将能够在“二进制详细信息”部分下看到相关的代码签名信息。

【讨论】:

很好的答案。授权文件位于名为“archived-expanded-entitlements.xcent”的同一目录中 这种方式对我有用......但有点没有。通过添加权利 com.apple.security.app-sandbox=true 和 com.apple.security.inherit=true 它确实阻止了 Xcode 的验证器抱怨。但是,当我的应用程序使用 NSTask 启动这些可执行文件时(这是对它们所做的事情),或者当我在终端中手动启动它们时,它们会立即崩溃。我怀疑当一个可执行文件自行启动时,“继承”会混淆沙箱 - 但我不确定知道。如果 NSTask 是此修复的用例,请注意这一点!【参考方案2】:

@dmid 的回答是正确且有效的。

但它可能更简单。假设可执行文件是myexe:

创建myexe.entitlements 文件:

<?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>com.apple.security.app-sandbox</key>
        <true/>
        <key>com.apple.security.inherit</key>
        <true/>
</dict>
</plist>

运行命令:

codesign -f -s "$YOUR_CERTIFICATE_HERE" --entitlements "myexe.entitlements" "myexe"

完成!

【讨论】:

以上是关于如何使用 xcode5 在 Mac 应用程序中对捆绑的可执行文件进行代码签名的主要内容,如果未能解决你的问题,请参考以下文章

Xcode5 的 MPI 问题

使用 Xcode5 在 Images.xcassets 中创建 iOS7 图标

在 Windows/Linux/Mac 上的 Java 程序中对全局热键做出反应?

Mac App Store Xcode 5 删除 Xcode 4

如何在没有开发人员帐户的情况下分发 mac osx 应用程序?

如何在没有 Mac 开发者计划成员资格的情况下使用 NSLogger 桌面客户端