【发布时间】:2012-09-14 07:30:33
【问题描述】:
我正在开发一个应用程序,其中使用全局按键事件将是其操作的要求。此外,我计划通过 App Store 严格分发它。 (这是一个 Mac 应用程序,而不是 iOS。)我得到了一个通过 addGlobalMonitorForEventsMatchingMask 监听全局事件的示例,但有一些警告。
注意:我选择使用现代 API,而不是依赖早期的 Carbon 热键方法。如果它们最终被弃用,我不想稍后再解决这个问题。
主要问题是必须信任应用程序才能检测到全局事件。否则,必须为所有应用程序启用可访问性。当我启用可访问性时,会成功检测到事件。此要求记录在此处,https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html。
我希望我的用户不必启用可访问性。根据我所做的其他研究,您可以通过调用 AXMakeProcessTrusted,然后重新启动应用程序来获得信任的应用程序。
在我使用的代码中,我没有收到身份验证提示。该应用程序将重新启动,但仍然不受信任(可能是因为我没有收到身份验证提示)。这是我这部分的代码:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
if (!AXAPIEnabled() && !AXIsProcessTrusted()) {
NSString *appPath = [[NSBundle mainBundle] bundlePath];
AXError error = AXMakeProcessTrusted( (CFStringRef)CFBridgingRetain(appPath) );
[self restartApp];
}
}
- (void)restartApp{
NSTask *task = [[NSTask alloc] init];
NSMutableArray *args = [NSMutableArray array];
[args addObject:@"-c"];
[args addObject:[NSString stringWithFormat:@"sleep %d; open \"%@\"", 3, [[NSBundle mainBundle] bundlePath]]];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:args];
[task launch];
[NSApp terminate:nil];
}
此外,我在https://developer.apple.com/library/archive/documentation/Security/Conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/TP30000995-CH206-BCIGAIAG 处查看了授权服务任务的文档。
首先让我担心的是这个信息框,“重要的是,应用沙箱中不支持授权服务 API,因为它允许权限提升。”
如果需要此 API 在重新启动应用程序之前获取身份验证提示,我可能无法在不启用辅助功能的情况下获取全局事件。
总之,我的具体问题是:
我的示例代码中关于如何获取 出现身份验证提示?
为了让身份验证提示出现,我是否需要 使用授权服务 API?
是否有可能拥有一个沙盒应用程序 访问全球活动?
【问题讨论】:
-
你设法解决这个问题了吗?我偶然发现了同样的问题:(
-
不是直接的。出于全局热键的目的,我不得不走使用 Cocoa 热键的路线。
-
我也在寻找提示用户的方法。我的猜测是,在安装应用程序并调用 AXMakeProcessTrusted 时,安装程序将以具有必要权限的 root 身份运行。如果安装程序是 Mac App Store,则必须有一个钩子来请求此权限。
标签: objective-c cocoa sandbox mac-app-store