MacOS 上的辅助功能提示问题

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

我正在 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 的辅助功能状态?

python macos accessibility pyinstaller pyobjc
1个回答
0
投票

感谢您的考虑。

我解决了这个问题。这与 .spec 文件无关。

当我们创建新的应用程序时,操作系统会为其分配一个新的唯一标识符。

Accessibility API 将权限与这个唯一标识符而不是应用程序本身联系起来,因此每个新版本都被视为不同的应用程序,并且需要新的权限。

如果我们经常重建应用程序并希望避免不断地重新授予可访问权限,我们可以考虑使用开发者证书签署我们的应用程序。

这会导致所有构建使用相同的签名,这应该可以防止每次创建新构建时都必须重新授予访问权限的问题。

这是我们需要做的:

  • 创建自签名证书。 如果没有Apple开发者帐户,我们可以按照以下步骤操作:

打开钥匙串访问(您可以在“实用程序”文件夹中找到它)。

从顶部菜单中,转到“钥匙串访问”>“证书助手”>“创建证书”。

为您的证书命名(例如“MyAppCert”),将“身份类型”设置为“自签名根”,将“证书类型”设置为“代码签名”,然后选中“让我覆盖默认值”复选框。

单击“继续”并按照说明创建您的证书。

  • 使用证书签署您的应用程序 现在您已准备好使用新创建的证书签署您的应用程序。为此,您需要在终端中使用 codesign 命令,如下所示:

codesign --deep --force --verbose --sign“MyAppCert”路径/to/your/app.app

将“MyAppCert”替换为您的证书名称,将 path/to/your/app.app 替换为您的 Python 应用程序的实际路径。

谢谢你。

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