2011-11-03 10 views
18

Ho questa app in cui ho bisogno di attivare un'altra voce di menu dell'app (come Print cmd + p) dalla mia app. In questo momento sto usando CGEventPostToPSN() per fare il lavoro e funziona bene, ma quando attivo sandboxing, smette di funzionare.Alternative per CGEventPostToPSN() per l'attivazione di un'altra voce di menu di un'app in un ambiente sandboxed?

CGEventPostToPSN(&psn, keyDownEvent); 
CFRelease(keyDownEvent); 
CGEventPostToPSN(&psn, keyUpEvent); 
CFRelease(keyUpEvent); 

La mia domanda ora è cosa posso fare quando ho bisogno di abilitare sandboxing? Ho sentito molto sull'API di accessibilità, ma non sono riuscito a scoprire come attivare un'altra voce di menu di un'app. Sono grato per qualsiasi risposta su questo problema.

Fabian

+0

Quando ho visto "elemento dello stato", ho pensato si stia riferendo a 'NSStatusItem', ma stampa sarebbe una voce di menu ordinario. – JWWalker

+0

Grazie, l'ho corretto. –

+1

Se è necessario parlare con un'altra app, non abilitare il sandboxing. Dubito che Apple approverà la tua app che richiede a un utente di abilitare l'API di accessibilità in modo che l'app possa funzionare correttamente. Il meglio che puoi fare per ora è presentare una richiesta di funzionalità ad Apple in cui descrivi il problema che stai cercando di risolvere. – Kentzo

risposta

2

Non ho ancora una risposta definitiva a questa domanda, ma sembra possibile con l'API di accessibilità come suggerito da @nielsbot.

Ci sono alcune funzioni promettenti come AXUIElementPostKeyboardEvent() e AXUIElementPerformAction(). Problema: l'utilizzo dell'Accessibility API per il controllo di un'altra app è proibito nella Sandbox Guideline di Apple.

Nota: con App Sandbox, è possibile e necessario abilitare l'app per l'accessibilità, come descritto in questo documento. Tuttavia, non è possibile eseguire la sandbox di un'app di assistenza come uno screen reader e non è possibile eseguire la sandbox di un'app che controlla un'altra app.

Se hai trovato questa domanda e hai lo stesso problema di me, temo che tu non abbia fortuna. Riconsiderare se devi davvero controllare un'altra app e, in caso affermativo, potresti non essere in grado di distribuire la tua app sul Mac App Store, mi dispiace.

Fabian

4

In un ambiente a tenuta stagna, è comunque possibile inviare Apple Event ad un'altra applicazione, è sufficiente fare domanda per un "Apple Event deroga temporanea" per la vostra applicazione. Questo è dettagliato in Apple Element Key Reference nella sezione "Apple Event Temporary Exception".

di Apple Event deroga temporanea
Quando si adotta App Sandbox, la vostra applicazione mantiene la capacità di:
● ricevere gli eventi di Apple
● inviare eventi Apple per sé
● rispondere a eventi di Apple che riceve
Tuttavia, con App Sandbox non è possibile inviare eventi Apple ad altre app a meno che non si configuri il diritto alle eccezioni temporanee di apple-events.

Per ogni app che si desidera inviare gli eventi Apple per specificare identificatore pacchetto dell'applicazione, in tutti i caratteri minuscoli, come valore stringa per il campo il valore di questa chiave diritto. Ad esempio, per abilitare l'invio di eventi Apple a iPhoto dalla tua app, utilizza il valore stringa com.apple.iphoto.

chiave Diritto Capability
com.apple.security.temporary-exception.apple-events Abilita invio degli eventi Apple per una o più applicazioni di destinazione.

Per quanto ne so, Apple non hanno esplicitamente definito 'temporaneo' in questo contesto, ma il consenso è che Apple consente questo per ora ma che qualche futuro App Store o l'aggiornamento di Mac OS X può rimuovere la capacità di farlo.

Si noti che è necessario indicare in anticipo in modo esplicito le app per le quali è necessario poter inviare eventi: non è possibile selezionare dinamicamente in fase di runtime dall'app o dall'utente.

+0

Sapevo di quell'eccezione temporanea e sarebbe stato ok per l'uso nella mia app. Sai come posso attivare una voce di menu nell'altra app utilizzando Apple Events? –

+0

@FabianKreiser, non penso ci sia un modo generale per richiamare una voce di menu usando Apple Events. Naturalmente, se stai scrivendo sia l'app del mittente che l'app del ricevitore, puoi progettare qualsiasi protocollo AppleEvent che desideri. – JWWalker

+1

@FabianKreiser, hai davvero bisogno di gestire una voce di menu? Non puoi inviare l'evento ''pdoc'' (' kCoreEventClass', 'kAEPrintDocuments')? –

Problemi correlati