【问题标题】:Accessibility permissions reset after application update应用程序更新后可访问权限重置
【发布时间】:2015-03-12 09:46:25
【问题描述】:

我制作了一个应用程序,要求用户授予对辅助功能的权限。它在应用程序首次启动并要求可访问性时正常工作

const void * keys[] = { kAXTrustedCheckOptionPrompt };
const void * values[] = { force };
CFDictionaryRef options = CFDictionaryCreate(kCFAllocatorDefault,
                                             keys,
                                             values,
                                             sizeof(keys) / sizeof(*keys),
                                             &kCFCopyStringDictionaryKeyCallBacks,
                                             &kCFTypeDictionaryValueCallBacks);
    
access = AXIsProcessTrustedWithOptions(options);
CFRelease(options);

问题是,当我发布新版本(使用 sparkle)时,可访问权限已经消失,所以用户应该再次授予权限。那是因为我的代码没有使用 Apple Developer ID 签名吗?我正在应用商店之外分发我的应用。

【问题讨论】:

  • 我注意到您使用 Sparkle 进行更新。我对它不太熟悉,但怀疑它以某种方式更改可执行文件可能会更改某种校验和......试试 Sparkle 2。它仍处于测试阶段,但它允许例如沙盒,因此它可以处理这类情况

标签: objective-c macos sparkle


【解决方案1】:

我没有办法对此进行测试,但我希望当用户批准应用程序的可访问性时,它会为应用程序创建一个临时代码签名,然后使用该签名来识别应用程序。一个新版本,甚至是同一版本的另一个副本,都不会具有相同的签名,因此不会被识别为“相同”的应用程序以实现无障碍目的。

解决方案:对应用进行签名,并使用相同的代码签名证书对后续版本进行签名。 Apple 提供的开发者 ID 证书对此有好处(并且也会让 Gatekeeper 满意),但我认为任何随机代码签名证书都可以让可访问性识别它(前提是您始终使用相同的证书)。

【讨论】:

  • 这是正确的,它记录在Code Signing Tasks 中:“[...] 您的产品的新版本,就像您在之前的版本上签名一样,使用相同的标识符和相同的 [ ...] 要求。用户的系统认为您的产品的新版本与之前的版本是相同的程序。例如,Keychain Services 不区分您的程序的旧版本和新版本,只要两者都已签名且唯一标识符保持不变。”
猜你喜欢
  • 2012-07-11
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2020-03-23
  • 2018-03-02
相关资源
最近更新 更多