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



我们最近发现了一个问题,即如果对应用程序捆绑包中的扩展进行签名(在我们的案例中使用代码签名(,则它们将无法打开。我们假设这是因为它们要么不能由主应用程序运行(因为一些签名/安全问题(,要么因为它们的签名不正确而被系统立即杀死。

设置

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

问题

如果我们不签署应用程序扩展,主应用程序和应用程序扩展将按预期启动(但这不是一个选项,因为当应用程序扩展未签署时,公证将失败(。如果我们签署应用程序扩展,应用程序扩展将不会启动(在运行主应用程序时(。我们认为这是因为macOS的Gatekeeper在启动时会立即杀死他们。但我们不确定原因。

演示项目

你可以在下面链接的Github存储库中找到一个非常简单的演示项目。这个演示项目只包含一个几乎为空的主应用程序,一个完全默认的应用程序扩展(除了myFolderURL,出于测试目的,它被更改为/(。

该演示项目还包含两个脚本,一个是构建应用程序并对其进行完全签名(带有应用程序扩展(,另一个是创建应用程序并签署除应用程序扩展之外的所有内容。两个脚本都导出一个.app文件和一个zip文件。

确保在脚本中插入开发者ID应用程序证书的名称(只需将XXXXXXX替换为证书的名称(

复制我们的问题:

  1. 运行未签名的应用程序,并用按钮打开首选项以确认已添加应用程序扩展
  2. 删除应用程序(以确保在测试已签名的应用程序时应用程序扩展不在首选项中(
  3. 打开带有签名扩展名的应用程序,打开应用程序并查看首选项时,您会发现该应用程序扩展名不在列表中(因此未打开(。这也可以使用"活动监视器"或"top"命令进行测试

演示项目链接:Github Repository

结论

总结:在对应用程序扩展进行签名时(演示中的Finder Sync(,该扩展在签名时不会打开/被终止。如果没有签署延期,一切都会按预期进行。如上所述,我们认为签名、公证或看门人可能是导致此问题的原因,这可能是我们的构建/签名自动化的一些问题(演示包含带有自动化代码的脚本(。情况会是这样吗?还是扩展处理方式不同,我们错过了一步?

对于其他遇到此问题的人,我们终于解决了:

最后,这是我们用来签署扩展的命令(错误的命令(:

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 创建分发签名代码

最新更新