Cuando otra aplicación solicita a mi aplicación que abra archivos, necesito averiguar qué aplicación es la fuente, porque se toman diferentes cursos de acción. En¿Cómo obtengo la aplicación de origen de un evento de Apple?
- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
el código es actualmente:
NSAppleEventDescriptor *currentEvent = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
NSAppleEventDescriptor *addrDesc = [currentEvent attributeDescriptorForKeyword:keyAddressAttr];
NSData *psnData = [[addrDesc coerceToDescriptorType:typeProcessSerialNumber] data];
const ProcessSerialNumber * PSN = [psnData bytes];
NSDictionary * info = nil;
// Same process check
ProcessSerialNumber currentPSN;
GetCurrentProcess(¤tPSN);
Boolean samePSN = FALSE;
if(PSN && noErr == SameProcess(¤tPSN, PSN, &samePSN) && !samePSN)
{
info = [(NSDictionary *) ProcessInformationCopyDictionary(PSN, kProcessDictionaryIncludeAllInformationMask) autorelease];
}
Esto siempre parecía funcionar bien. Pero ahora (trabajando en 10.6.4) he descubierto que en algunos casos me sale el PSN mal, a veces resultando en información de ser nula, otras veces Contiene
BundlePath = "/System/Library/CoreServices/CoreServicesUIAgent.app";
CFBundleExecutable = "/System/Library/CoreServices/CoreServicesUIAgent.app/Contents/MacOS/CoreServicesUIAgent";
CFBundleIdentifier = "com.apple.coreservices.uiagent";
CFBundleName = CoreServicesUIAgent;
CFBundleVersion = 1093697536;
FileCreator = "????";
FileType = "????";
Flavor = 3;
IsCheckedInAttr = 1;
LSBackgroundOnly = 0;
LSSystemWillDisplayDeathNotification = 0;
LSUIElement = 1;
LSUIPresentationMode = 0;
este servicio del sistema, obviamente, no es la aplicación Busco para. Comprobé otro atributo: keyAddressAttr y keyOriginalAdressAttr son lo mismo. Otra cosa que sonó interesante fue keyEventSourceAttr, pero no puedo encontrar ninguna documentación sobre esto: el SInt16 al que regresa no parece ser un pid o cualquier otra cosa que pueda ser útil para mí.
Entonces mis preguntas serían:
1. ¿Hay algún problema con el código citado?
2. ¿Dónde encuentro documentación sobre keyEventSourceAttr?
3. ¿Qué está sucediendo aquí? ¿Por qué este Servicio del sistema es la fuente de mi evento en lugar del proceso?
4. ¿Cuál es una forma confiable de encontrar la fuente real (una aplicación) cuando se le solicita abrir archivos? Como este es un evento, debe tener una fuente; No deseo hacer un seguimiento de las aplicaciones que estuvieron activas recientemente y podría ser el remitente.
No sé mucho sobre Apple Events, pero si esto es la URL de apertura, algo como 'archivos abiertos: // file: & sourceapplication: ' Puede saber cuál es la aplicación de origen. ¿Leyó la documentación de Apple al respecto? Buena suerte –
theShay