xcode 如果使用命令行工具对扩展进行了签名,则无法打开扩展

1wnzp6jl  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(128)

我们最近发现了一个问题,即应用捆绑包中的扩展如果被签名(在我们的例子中,使用了代码设计)就无法打开。我们假设这是因为它们不能被主应用运行(因为一些签名/安全问题),或者系统会因为它们被错误签名而立即杀死它们。

设置

1.只需创建一个包含任何应用扩展的主应用(我们已经尝试过FinderSync和Share)
1.使用xcodebuild命令归档并导出应用程序(尽管通过Xcode导出也可以)
1.对应用程序容器(.app)和扩展名(内容/插件中的.appex文件)进行签名。
1.打开应用程序
1.扩展模块在首选项中不可见,并且未运行

问题

如果我们不对应用扩展签名,主应用和应用扩展将按预期启动(但这不是一个选项,因为当应用扩展未签名时,公证将失败)。如果我们对应用扩展签名,应用扩展将不会启动(当运行主应用时)。我们假设这是因为macOS Gatekeeper在启动时会立即终止它们。但我们不确定原因。

演示项目

你可以在下面链接的Github Repository中找到一个非常简单的演示项目。这个演示项目只包含一个几乎空的主应用,一个完全默认的应用扩展(除了myFolderURL被更改为/用于测试目的之外,所有内容都保持生成时的状态)。
演示项目还包含两个脚本,一个用于生成应用程序并对其进行完全签名(使用应用程序扩展名),另一个用于生成应用程序并对除应用程序扩展名之外的所有内容进行签名。这两个脚本都导出一个.app文件和一个zip文件。
确保将您的开发人员ID应用证书的名称插入脚本(只需将XXXXXXX替换为您的证书名称)
要重现我们的问题:
1.运行未签名的应用程序,并使用按钮打开首选项,以确认已添加应用程序扩展。
1.删除应用程序(以确保在测试签名的应用程序时,应用程序扩展不在首选项中)
1.打开带有签名扩展名的应用程序,您将看到在打开应用程序并查看首选项时,该应用程序扩展名未出现在列表中(因此未打开)。这也可以使用活动监视器或“top”命令进行测试。

链接到演示项目:Github Repository

结论
总结如下:签署应用程序延伸模块时(演示中的Finder同步),扩展没有打开/被杀死时,扩展被签署。如果扩展没有签署一切工作的预期。如前所述,我们相信无论是签署,公证,或网关守卫可能是这个问题的原因,这可能是我们构建/签名自动化的一些问题(这个演示包含了脚本和我们的自动化代码)。是这样吗?或者扩展的处理方式不同,我们遗漏了一个步骤?

l0oc07j2

l0oc07j21#

对于其他遇到此问题的人,我们终于找到了答案:
最后,这是我们用来签署我们的扩展的命令(不正确的命令):

codesign -s "Developer ID Application: XXXXXXXXX (XXXXXXX)" -f --timestamp -o runtime "OurApp.app/Contents/PlugIns/OurExtension.app"

在控制台中进行一些挖掘后,我们发现扩展被网关守卫关闭,并显示以下消息:

[/Applications/Extension_With_Signing_Demo.app/Contents/PlugIns/findersynctest.appex]: plug-ins must be sandboxed

发现此消息后,错误的原因对我们来说非常清楚:因为我们认为在签署扩展时没有必要实际传递权限(因为我们认为它们不需要任何权限),并且我们不知道扩展需要沙箱来运行。
为了解决这个问题,我们所做的就是添加一个包含一些基本授权的授权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.files.user-selected.read-only</key>
    <true/>
</dict>
</plist>

并将他们纳入我们的麾下

codesign -s "Developer ID Application: XXXXXXXXX (XXXXXXX)" -f --timestamp -o runtime --entitlements EntitlementsFile.entitlements "OurApp.app/Contents/PlugIns/OurExtension.app"

之后,扩展按预期启动。

摘要

我们的问题的解决方案是这样一个事实,即我们在签署扩展时没有传递任何授权,即使扩展需要沙箱授权。
关于如何在签署应用程序或应用程序扩展(以及一般的代码签署)时添加授权的非常有用的资源:为Mac创建分发签名代码

相关问题