2

我有一个第三方命令行工具,它从一个主要的可可应用程序启动,该应用程序将在 Mac App Store 中分发。

我需要对第三方命令行工具进行沙箱处理,但是当我运行它(使用 NSTask)时,它会因错误而崩溃

“应用程序特定签名:容器对象初始化失败:无法获取应用程序 XXX 的 bundleid”

(在控制台中,我可以看到以下错误消息)。这是我在主可可应用程序中所做的:

NSTask* task          = [[NSTask alloc]init];
NSString* commandPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"command"];
task.launchPath       = commandPath;
[task setArguments:args];
[task launch];

每次我运行它时,都会出现一个弹出窗口,其中包含“OS X 需要修复您的库以运行应用程序”的信息。输入您的密码以允许此操作。” 我已经使用以下命令签署了这个命令行工具: 

codesign --entitlements ./XXX.entitlements -s "3rd Party Mac Developer Application: XXX" ./commandlinetool 

为了确保,我使用以下命令仔细检查了它:

codesign --display --entitlements - ./commandlinetool  

这是信息:

<!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.files.downloads.read-write</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-write</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>
</dict>
</plist>

我还检查了这个命令:

codesign --display --verbose=4 XXX

并得到了这个信息:

Identifier=com.XXX.XXX.XXX
Format=Mach-O thin (x86_64)
CodeDirectory v=20100 size=75902 flags=0x0(none) hashes=3786+5 location=embedded
Hash type=sha1 size=20
CDHash=24fdcb9b5444a91f60xxxxx3a66bafa7030109e63fb1c
Signature size=4347
Authority=3rd Party Mac Developer Application: XXX
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=May 10, 2014, 12:04:34 PM
Info.plist=not bound
Sealed Resources=none
Internal requirements count=1 size=216

我也尝试在命令行工具中添加一个 info.plist 文件,按本章步骤在此处输入链接描述但没有任何反应,Info.plist 的结果仍然是“没有绑定”。

如何沙箱第三方命令行工具以及如何将 info.plist 文件添加到命令行工具?我错过了什么?有人可以帮助我吗?任何帮助或指针将不胜感激。

4

1 回答 1

0

好久没注意到这个问题了,还是有人问我怎么做。

根据Apple开发文档。

如果您的应用程序使用使用 posix_spawn 函数或 NSTask 类创建的子进程,您可以将子进程配置为继承其父进程的沙箱。但是,使用子进程并不能提供使用 XPC 服务所提供的安全性。

因此,您应该使用以下权利签署您的嵌入式命令行:

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

现在您的应用程序可以工作了!

于 2018-12-21T07:02:26.343 回答