Sto lavorando a un'app in cui l'utilizzo di eventi key-down globali sarà un requisito per il suo funzionamento. Inoltre, ho intenzione di distribuirlo rigorosamente tramite l'App Store. (È un'app per Mac, non per iOS.) Ho avuto un esempio di ascolto degli eventi globali che funzionano tramite addGlobalMonitorForEventsMatchingMask, ma con avvertenze.Eventi globali, il Mac App Store e la sandbox
Nota: sto facendo la scelta di utilizzare le API moderne e non fare affidamento sui precedenti metodi hotkey Carbon. Nel caso in cui alla fine siano deprecati, non voglio dover risolvere questo problema in seguito.
Il problema principale è che l'app deve essere attendibile affinché gli eventi globali possano essere rilevati. Altrimenti, l'accessibilità deve essere abilitata per tutte le app. Quando abilito l'accessibilità, gli eventi vengono rilevati correttamente. Questo requisito è documentato qui, http://developer.apple.com/library/mac/#DOCUMENTATION/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html.
Preferisco che per i miei utenti, non dovranno abilitare l'accessibilità. Da altre ricerche che ho svolto, è possibile ottenere un'applicazione attendibile chiamando AXMakeProcessTrusted e riavviando l'applicazione.
Nel codice che sto utilizzando, non ottengo una richiesta di autenticazione. L'app verrà riavviata, ma non è ancora attendibile (probabilmente perché non ricevo un prompt di autenticazione). Ecco il mio codice per questa parte:
- (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];
}
Inoltre, ho guardato la documentazione per compiti di servizio Autorizzazione qui https://developer.apple.com/library/mac/#documentation/security/conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/TP30000995-CH206-BCIGAIAG.
La prima cosa che mi preoccupa che spunta è questa casella informativa, "Importante L'API dei servizi di autorizzazione non è supportata all'interno di una sandbox dell'app perché consente l'escalation dei privilegi."
Se questa API è richiesta per ottenere il prompt di autenticazione prima di riavviare l'app, sembra che io possa non essere in grado di ottenere eventi globali senza la funzione di accessibilità attivata.
In sintesi, le mie domande specifiche sono:
C'è un errore nel mio codice di esempio su come arrivare a comparire il prompt di autenticazione ?
Per visualizzare la richiesta di autenticazione, sono necessario per utilizzare l'API dei servizi di autorizzazione?
E 'possibile, o non è possibile, avere un'app sandbox che ha l'accesso agli eventi globali?
Sei riuscito ad aggirare questo? Ho trovato lo stesso problema :( –
Non direttamente. Allo scopo di tasti di scelta rapida globali, ho dovuto seguire il percorso di utilizzo dei tasti di scelta rapida Cocoa. – Geuis
Sto anche cercando un modo per richiedere all'utente. si eseguirebbe come root con le autorizzazioni necessarie quando l'app viene installata e chiama AXMakeProcessTrusted Se l'installer è il Mac App Store, è necessario un hook per richiedere questa autorizzazione. – Brennan