公证 MacOS 应用程序后加载 python lib 时出错

Posted

技术标签:

【中文标题】公证 MacOS 应用程序后加载 python lib 时出错【英文标题】:Error loading python lib after notarizing MacOS application 【发布时间】:2021-06-04 08:36:03 【问题描述】:

我编译的python pyqt5应用程序经过苹果系统公证后无法运行。我正在运行 Big Sur 11.4。

[8181] Error loading Python lib '/var/folders/v4/55fs66d13_zgjry5v8vpbbb40000gn/T/_MEIchDPs9/Python': dlopen: dlopen(/var/folders/v4/55fs66d13_zgjry5v8vpbbb40000gn/T/_MEIchDPs9/Python, 10): no suitable image found.  Did find:
    /var/folders/v4/55fs66d13_zgjry5v8vpbbb40000gn/T/_MEIchDPs9/Python: code signature in (/var/folders/v4/55fs66d13_zgjry5v8vpbbb40000gn/T/_MEIchDPs9/Python) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
    /var/folders/v4/55fs66d13_zgjry5v8vpbbb40000gn/T/_MEIchDPs9/Python: stat() failed with errno=1

它说找不到python库。

我试过了,没有运气:

Python 3.9.5 Python 3.7.8 Python 3.7.6 和 pyinstaller 4.0

制作未经公证的可执行文件可以正常工作。应用程序包中有两个文件。 pyqt5 应用程序可执行文件和一个 bash 脚本。公证后,bash 脚本运行良好。

pyinstaller 配置:

pyinstaller --noconfirm --onefile --noconsole --icon ... --name ... --add-data ... main.py

.spec 文件中添加的额外参数:

app = BUNDLE(exe,
             name='Application.app',
             icon='/Users/rokas/Desktop/USB_ios/resources/icon.ico',
             bundle_identifier='com.application.upgrade.tool',
             info_plist=
               'CFBundleName': 'Application',
               'CFBundleDisplayName': 'Application',
               'CFBundleVersion': '1.0',
               'CFBundleShortVersionString': '1.0',
               'NSRequiresAquaSystemAppearance': 'No',
               'NSHighResolutionCapable': 'True',
             ,
)

这些是我授予我的应用程序的权利:

    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>

我的应用程序应该打开 shell 脚本来执行一些功能。但这只是它的一小部分功能。

建议代码签名过程由内而外完成,但应用程序是单个文件应用程序,因此没有太多要签名的内容。我使用的符号命令是。

codesign -s "Developer id certificate" -v --deep --timestamp --entitlements entitlements.plist -o runtime "application.app"

【问题讨论】:

【参考方案1】:

我将回答我自己的问题,因为我解决了问题。问题在于我为我的申请提供的权利。

从错误信息的其中一行可以很清楚的看出:

... not valid for use in process using Library Validation: ...

因为应用程序调用了应用程序包中的脚本,所以它需要一个额外的权利。

com.apple.security.cs.allow-unsigned-executable-memory

可以在此处找到我为 MacOS 应用程序公证所遵循的指南: https://haim.dev/posts/2020-08-08-python-macos-app/

【讨论】:

以上是关于公证 MacOS 应用程序后加载 python lib 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何使用适用于 macOS 的 Visual Studio 代码为外部 Mac 应用商店签署和公证电子应用程序构建?

仅在切换选项卡后加载内容。 Javascript 引导程序

延迟后加载 iFrame 的源

Mac Electron 应用的签名(signature)和公证(notarization)

php - Laravel:如何在从下拉列表中选择更改后加载 Ajax 数据?

Angular Bootstrap 后加载模块