相关疑难解决方法(0)

全球活动,Mac App Store和沙盒

我正在开发一个应用程序,其中使用全局按键事件将是其操作的必要条件.此外,我计划通过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来获取身份验证提示,则似乎在启用辅助功能的情况下我可能无法获取全局事件.

总之,我的具体问题是:

  1. 我的示例代码中是否有关于如何显示身份验证提示的错误?

  2. 为了显示身份验证提示,我是否需要使用Authorization Services …

cocoa sandbox objective-c mac-app-store

6
推荐指数
2
解决办法
2282
查看次数

标签 统计

cocoa ×1

mac-app-store ×1

objective-c ×1

sandbox ×1