使用 QWebEngineView 签署应用程序时不同的 PyInstaller 行为

问题描述 投票:0回答:1

我有一个使用 QWebEngineView 小部件的应用程序,当我使用 PyInstaller 创建分发包时,如果我对应用程序进行签名或不签名,我会得到不同的行为。我创建了一个可重现的小示例(tester.py):

import time
import sys
from PySide6.QtCore import QUrl
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

app = QApplication(sys.argv)
web = QWebEngineView()
web.setHtml('<html><body></body></html>')

wdg = QWidget()
vl = QVBoxLayout(wdg)
btn1 = QPushButton('Clear')
btn2 = QPushButton('Something')
btn3 = QPushButton('Google')
vl.addWidget(web)
vl.addWidget(btn1)
vl.addWidget(btn2)
vl.addWidget(btn3)
wdg.setLayout(vl)

btn1.clicked.connect(lambda x: web.setHtml('<html><body></body></html>'))
btn2.clicked.connect(lambda x: web.load(QUrl("https://something.com")))
btn3.clicked.connect(lambda x: web.load(QUrl("https://google.com")))
wdg.show()

sys.exit(app.exec())

使用

python tester.py
效果很好,可以清除内容并且两个站点都可以正常加载。如果我使用
pyinstaller tester.py
创建发行版,那么运行
./dist/tester/tester
也同样有效:

QWebEngineView working fine

但是,如果我使用

pyinstaller --codesign-identity XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX tester.py
签署应用程序,那么在运行二进制文件时,我会得到不同的行为。在运行 MacOS Big Sur 的配备 Intel Core i7 的 Mac 中,清晰的页面和 Something.com 加载良好,但 google.com 似乎禁用了 QWebEngineView 小部件。如果我在使用运行 MacOS Sequoia 15.0.1 的 Apple Silicon M2 Max 的 Mac 上签署该应用程序,则该小部件似乎会不断被禁用:

QWebEngineView disabled when loading content

协同设计身份有效(由于显而易见的原因在上面被屏蔽)。我尝试过使用带有 -w 的窗口版本,没有区别。我也尝试使用 --target-architecture 指定目标架构,仍然没有区别。

所有测试计算机均使用Python 3.12、PyInstaller 6.7.0、PySide6 6.6.1。

有什么想法吗?我需要分发该应用程序,因此需要对其进行签名。

python pyinstaller pyside6 qwebengineview
1个回答
0
投票

我已经找到了解决方案。首先,升级到最新的 PyInstaller。应用程序包创建的方法不断发展;例如,PyInstaller 6.7.0 在捆绑包结构中创建了一些损坏的链接,而 6.10.0 已修复该问题。

但是,它仍然无法使用 QWebEngineView 正确签署应用程序。签署这些应用程序如此困难的原因是 QWebEngineCore.framework 需要一个辅助应用程序 QWebEngineProcess。每当您使用 QWebEngineView 执行应用程序时,此应用程序都会在后台运行:

ps aux | grep QtWebEngineProcess | tr -s ' ' | cut -d' ' -f 11-
/Users/xxxx/yyyy.app/Contents/Frameworks/PySide6/Qt/lib/QtWebEngineCore.framework/Versions/A/Helpers/QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess --type=renderer --webengine-schemes=qrc:sV --disable-speech-api --disable-databases --disable-blink-features=EyeDropperAPI,WebOTP --lang=en-IE --num-raster-threads=4 --enable-zero-copy --enable-gpu-memory-buffer-compositor-resources --enable-main-frame-before-activation --renderer-client-id=3 --time-ticks-at-unix-epoch=-1730914965349991 --launch-time-ticks=842584495483 --shared-files --field-trial-handle=1718379636,r,5449269025075726458,14262866589345050640,262144 --enable-features=NetworkServiceInProcess2,ScreenCaptureKitMacScreen,TracingServiceInProcess --disable-features=BackgroundFetch,EyeDropper,InstalledApp,WebOTP,WebPayments,WebUSB --variations-seed-version --seatbelt-client=24

PyInstaller 正确地将助手打包到捆绑包中,但不知何故签名不起作用,因此当您运行应用程序时,后台没有运行 QtWebEngineProcess,因此即使应用程序运行,QtWebEngineView 小部件也不会运行。

我的解决方案是用

codesign
手动签署捆绑包。它不再提供对捆绑包进行深度签名的方法,因此您需要知道要签名哪些文件。这似乎对我有用:

  1. 创建 PyInstaller 捆绑包无需签名

    pyi-makespec --log-level INFO --onedir --name yyyy --windowed --osx-bundle-identifier xx.xxx.xxxx --version 1.0 src/tester.py pyinstaller yyyy.spec

  2. 签署捆绑包。签名的顺序很重要(QtWebEngineProcess在QtWebEngineCore.framework之前,二进制在所有内容之后,然后是bundle):

    codesign --force --verify --verbose --sign "XXXXXXXXXXXX" --entitlements dist/yyyy.app/Contents/Frameworks/PySide6/Qt/lib/QtWebEngineCore.framework/Versions/A/Helpers/QtWebEngineProcess.app/内容/资源/QtWebEngineProcess.entitlements --timestamp --identifier“xx.xxx.xxxx”--选项运行时dist/yyyy.app/Contents/Frameworks/PySide6/Qt/lib/QtWebEngineCore.framework/Versions/Current/Helpers/QtWebEngineProcess.app/Contents/MacOS/QtWebEngineProcess

    “framework”“dylib”“so”“pak”“dat”“bin”“xcprivacy”“conf”“plist”中的内容;做 对于

    find dist/yyyy.app -name *.$what
    中的文件;做 codesign --force --verify --verbose --sign "XXXXXXXXXXXX" --timestamp --identifier "xx.xxx.xxxx" --options 运行时 $file 完毕 完成

    codesign --force --verify --verbose --sign "XXXXXXXXXXXX" --timestamp --identifier "xx.xxx.xxxx" --options 运行时 dist/yyyy.app/Contents/MacOS/yyyy

    codesign --force --verify --verbose --sign "XXXXXXXXXXXX" --timestamp --identifier "xx.xxx.xxxx" --options 运行时 dist/yyyy.app

您显然需要有效的代码签名身份等。以上内容已被苹果公证服务接受。

© www.soinside.com 2019 - 2024. All rights reserved.