我正在 MacOS 上构建一个 python 应用程序。 它需要访问系统事件,所以我使用
AXIsProcessTrustedWithOptions
来提示可访问性对话框。
import objc
if sys.platform == 'darwin':
AS = objc.loadBundle('CoreServices', globals(), '/System/Library/Frameworks/ApplicationServices.framework')
objc.loadBundleFunctions(AS, globals(), [('AXIsProcessTrustedWithOptions', b'Z@')])
options = {'AXTrustedCheckOptionPrompt': True}
trusted = AXIsProcessTrustedWithOptions(options)
if trusted:
print("The program has permission to access system events.")
else:
print("The program does not have permission to access system events.")
我使用
Pyinstaller
构建了应用程序(Myapp 1.0.0),所有功能都运行良好。
当我构建新版本 Myapp 1.0.1 时,会出现此问题。
我已经授予了Myapp 1.0.0的可访问性,但是每次执行Myapp 1.0.1时都会再次出现可访问性对话框。 (系统似乎将它们识别为不同的应用程序。但辅助功能对话框中的“Myapp”只有一项)
这是运行 Pyinstaller 的 Myapp.spec 文件。
`block_cipher = None
a = Analysis(
['main.py'],
pathex=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='Myapp',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['BG Builder.icns'],
manifest='akespec',
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='BG Builder',
)
app = BUNDLE(
coll,
name='Myapp.app',
icon='Myapp.icns',
bundle_identifier='com.mycompany.myapp',
version='1.0.0',
info_plist={
'NSPrincipalClass': 'NSApplication',
'CFBundleExecutable': 'Myapp',
'CFBundleName': 'Myapp',
'CFBundleDisplayName': 'Myapp',
'NSAppleScriptEnabled': True,
'CFBundlePackageType': 'APPL',
'CFBundleLongVersionString': '1.0.0',
'CFBundleShortVersionString': '1.0.0',
'NSAppleScriptEnabled': 'true',
'LSApplicationCategoryType': 'public.app-category.developer-tools',
},
)`
Myapp 1.0.1 如何继承 Myapp 1.0.0 的辅助功能状态?
感谢您的考虑。
我解决了这个问题。这与 .spec 文件无关。
当我们创建新的应用程序时,操作系统会为其分配一个新的唯一标识符。
Accessibility API 将权限与这个唯一标识符而不是应用程序本身联系起来,因此每个新版本都被视为不同的应用程序,并且需要新的权限。
如果我们经常重建应用程序并希望避免不断地重新授予可访问权限,我们可以考虑使用开发者证书签署我们的应用程序。
这会导致所有构建使用相同的签名,这应该可以防止每次创建新构建时都必须重新授予访问权限的问题。
这是我们需要做的:
打开钥匙串访问(您可以在“实用程序”文件夹中找到它)。
从顶部菜单中,转到“钥匙串访问”>“证书助手”>“创建证书”。
为您的证书命名(例如“MyAppCert”),将“身份类型”设置为“自签名根”,将“证书类型”设置为“代码签名”,然后选中“让我覆盖默认值”复选框。
单击“继续”并按照说明创建您的证书。
codesign --deep --force --verbose --sign“MyAppCert”路径/to/your/app.app
将“MyAppCert”替换为您的证书名称,将 path/to/your/app.app 替换为您的 Python 应用程序的实际路径。
谢谢你。