macos - AppStore 拒绝使用外部构建的控制台二进制文件的 MacOS 应用程序的 SandBox

标签 macos app-store executable codesign appstore-sandbox

我有 2 个 MacOS 应用程序想要提交到应用程序商店。一个几乎是控制台程序的 GUI;另一个是控制台程序。另一个是独立的应用程序,但大量使用另一个控制台程序。

这两个控制台程序二进制文件都是开源的,获得 MIT 许可,但具有非常外部和特定的构建环境(包括 cmake 等),并且没有必要(而且很痛苦)将它们集成到我的应用程序中构建在一起。所以我想构建它们,然后将它们嵌入到各自的应用程序中。

我将它们嵌入,并在启用应用程序沙箱的情况下进行了测试。一切正常。但是,当我尝试提交到 Apple Store 时,他们声称是这样的:

错误 ITMS-90296:“应用程序沙箱未启用。以下可执行文件必须在权利属性列表中包含 bool 值为 true 的“com.apple.security.app-sandbox”权利:[( "MWAPPTECH.MyApp.pkg/Payload/TheHider.app/Contents/Resources/myConsoleBinary")] 请参阅应用程序沙箱页面 https://developer.apple.com/devcenter/mac/app-sandbox/ 了解有关对应用程序进行沙箱处理的更多信息。"

https://developer.apple.com/devcenter/mac/app-sandbox/”似乎不存在...

根据我的研究,看来我必须以某种方式对这些控制台可执行文件进行协同设计。我尝试自己对可执行文件进行协同设计,但结果完全失败。

我完全迷失了。你有什么想法吗?

最佳答案

在我的例子中,我嵌入了 Perl:这个简单的协同设计命令添加了适当的权利,然后上传就可以工作了:

codesign -v -f --sign“开发者 ID 应用程序:BlahBlah”--entitlements staticPerl.entitlements $perlEmbedRoot/bin/staticPerl5.30.0

权利文件包含以下内容:

<?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>

我的外部构建的控制台二进制文件恰好是静态 perl,但任何命令行程序都会以这种方式签名。除了静态之外,它还是使用配置/制作的普通 Perl 构建,结果是可执行文件和支持代码库。我不在 Xcode 中构建它,它在 Xcode 之外完成一次。我只需将可执行文件和(经过修剪的)lib/* 复制到名为“perlembed”的文件夹,然后对 perl 及其权利进行协同设计。该文件夹“perlembed”被添加到我的 Xcode 项目中,并且是应用程序目标的一部分,并显示为资源位于应用程序包的 Resources 文件夹中。文件夹树没有什么特别的,但它就在这里(不包括 lib/*,无论如何都不相关)。HTH:

cd ~/Private/Developer/staticPerl/
./buildStaticPerl
cp staticPerl5.30.0 $perlEmbedRoot/bin/
codesign -v -f --sign "Developer ID Application: Stephen  (XYZZY)" --entitlements staticPerl.entitlements $perlEmbedRoot/bin/staticPerl5.30.0 
cp -Rp staticLib/*  $perlEmbedRoot/lib/
[lusol@Hornet:~/Private/Developer/staticPerl] dir perlembed
drwxr-xr-x   5 lusol  staff   160 Dec 15 14:15 .
drwxr-xr-x  13 lusol  staff   416 Dec 17 12:47 ..
-rw-r--r--@  1 lusol  staff  6148 Dec 15 14:15 .DS_Store
drwxr-xr-x   3 lusol  staff    96 Dec 15 14:10 bin
drwxr-xr-x  31 lusol  staff   992 Dec 10 13:47 lib
[lusol@Hornet:~/Private/Developer/staticPerl] find  perlembed 
perlembed
perlembed/.DS_Store
perlembed/bin
perlembed/bin/staticPerl5.30.0
perlembed/lib
perlembed/lib/vars.pm
perlembed/lib/FileHandle.pm
perlembed/lib/Carp.pm

哦,这是可执行文件的路径,相对于应用程序的资源文件夹,连接在一起,它适合 system() 函数,也许:

NSBundle *bund = [NSBundle mainBundle];
self.resourcePath = [bund resourcePath];
self.perlExe = @"./perlembed/bin/staticPerl5.30.0 -I./perlembed/lib/";

关于macos - AppStore 拒绝使用外部构建的控制台二进制文件的 MacOS 应用程序的 SandBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49096263/

相关文章:

Python os.list_dir 停止一级短

python - 运行使用 folium 的可执行文件时,Branca Python 模块无法找到 2 个必要的 json 文件

mercurial - 查找哪些 mercurial 提交更改了文件的可执行位

objective-c - Mac 应用程序中的 Facebook

ios - iOS 应用程序验证和临时分发的困惑

macos - 如何使用 LaunchDaemons (launchd) 启动 Program.app?

android - 是否可以根据国家/地区限制在 Amazon appstore 上的应用程序分发?

ios - 没有使用 iTunes Connect Access 的帐户

c++ - boost::filesystem 体系结构 x86_64 的 undefined symbol

c++ - 编译 Qt 应用程序时出现体系结构 x86_64 错误的重复符号