我正在开发一个应用程序,其中使用全局按键事件将是其操作的必要条件.此外,我计划通过App Store严格分发.(它是一个Mac应用程序,而不是iOS.)我已经得到了一个通过addGlobalMonitorForEventsMatchingMask监听全局事件的示例,但有一些警告.
注意:我正在选择使用现代API而不依赖于早期的Carbon热键方法.如果他们最终被弃用,我不想在以后解决这个问题.
主要问题是必须信任应用程序才能检测到全局事件.否则,必须为所有应用启用辅助功能.启用辅助功能时,会成功检测到事件.此要求记录在此处,http://developer.apple.com/library/mac/#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];
}
Run Code Online (Sandbox Code Playgroud)
此外,我在这里查看了授权服务任务的文档https://developer.apple.com/library/mac/#documentation/security/conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/TP30000995-CH206-BCIGAIAG.
弹出的第一件事就是弹出这个信息框,"重要的是,应用程序沙箱中不支持授权服务API,因为它允许权限提升."
如果在重新启动应用程序之前需要此API来获取身份验证提示,则似乎在未启用辅助功能的情况下我可能无法获取全局事件.
总之,我的具体问题是:
我的示例代码中是否有关于如何显示身份验证提示的错误?
为了显示身份验证提示,我是否需要使用Authorization Services …