mac full for fantastical buy app osx cocoa calendar osx-mountain-lion
OpenCalendar.zip

osx - for - fantastical 2 mac full



¿Iniciar programáticamente Mac Calendar.app(y elegir una fecha específica) desde mi aplicación? (4)

Me gustaría incluir un botón en mi aplicación Mac que, cuando se presiona, iniciará la aplicación de calendario predeterminada del usuario. Preferiblemente, me gustaría tener el calendario abierto a una fecha determinada.

Esto es para OS X Mountain Lion.

¿Hay una manera general de hacer esto?

Edit : FWIW, esto es lo que estoy haciendo ahora:

- (IBAction)launchCalendarApp:(id)sender { [[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Calendar.app"]; }

Sé que codificar duro el camino como este es una mala idea y por eso estoy haciendo la pregunta.

Actualización : Esto es lo que terminé haciendo:

- (IBAction)launchCalendarApp:(id)sender { NSWorkspace *sharedWorkspace = [NSWorkspace sharedWorkspace]; NSString *iCalPath = [sharedWorkspace absolutePathForAppBundleWithIdentifier:@"com.apple.iCal"]; BOOL didLaunch = [sharedWorkspace launchApplication:iCalPath]; if (didLaunch == NO) { NSString *message = NSLocalizedString(@"The Calendar application could not be found.", @"Alert box message when we fail to launch the Calendar application"); NSAlert *alert = [NSAlert alertWithMessageText:message defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:@""]; [alert setAlertStyle:NSCriticalAlertStyle]; [alert runModal]; } }

Parece que todas las formas posibles de hacerlo son soluciones temporales hasta que se desarrolle una API mejor. Mi solución es similar a la sugerencia de Jay. Estoy usando el identificador de paquete para obtener el camino porque creo que es un poco menos frágil. Es poco probable que Apple cambie la identificación del paquete en el futuro, incluso si ellos (o el usuario) deciden cambiar el nombre de la aplicación. Lamentablemente, este método no me lleva a una fecha específica. Investigaré más a fondo algunas de las otras sugerencias (usando ical: // etc.) cuando tenga más tiempo.

Actualización 2 : NSGod tiene una magnífica respuesta a continuación que también abre el Calendario a una fecha específica siempre que su aplicación no esté en la zona de pruebas.


Puede intentar usar EventKit para crear una instancia de EKCalendarItem de la fecha y hora deseadas, abrir el evento y luego eliminarlo inmediatamente después. Si está bien sincronizado, puede que ni siquiera parpadee visiblemente con el calendario del usuario.

Es otro error, pero hasta que NSWorkspace tenga un método -openDate: los kludges son el único recurso.


Nota: Todavía estaba investigando esto mientras actualizaba con lo que usaba, pero agregaré este FWIW.

Usar el identificador de paquete de la aplicación generalmente es una forma más robusta de referirse a una aplicación y luego utilizar el nombre solo, ya que un usuario puede mover o cambiar el nombre de la aplicación en OS X, pero no puede cambiar fácilmente el identificador de paquete. Por otra parte, incluso cuando Apple cambió el nombre de iCal.app a Calendar.app, el CFBundleIdentifier sigue siendo com.apple.iCal .

if (![[NSWorkspace sharedWorkspace] launchAppWithBundleIdentifier:@"com.apple.iCal" options:NSWorkspaceLaunchDefault additionalEventParamDescriptor:nil launchIdentifier:NULL]) { NSLog(@"launching Calendar.app failed!"); }

El código anterior funcionará incluso si tu aplicación está en la zona de pruebas. Es posible que intente crear un NSAppleEventDescriptor personalizado que especifique el equivalente de algo así como el siguiente código AppleScript, pero probablemente será denegado debido a la caja de arena:

view calendar at date "Sunday, April 8, 2012 4:28:43 PM"

Si su aplicación no tiene que estar en la zona de pruebas, es mucho más fácil si utiliza el puente de scripting, y con ese método es posible seleccionar un NSDate específico.

Proyecto de ejemplo usando ScriptingBridge: OpenCalendar.zip

En ese proyecto, utilizo el siguiente código:

SBCalendarApplication *calendarApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.iCal"]; [calendarApp viewCalendarAt:[self.datePicker dateValue]];

Eso lanzará Calendar.app/iCal.app y cambiará el calendario a la fecha especificada.



Entonces parece que por ahora tendrías que recurrir a un enfoque de cableado, por ejemplo

// Launches Calendar.app on 10.7+ [[NSWorkspace sharedWorkspace] launchApplication:@"Calendar"];

O utilice el esquema de URL utilizando lo que es compatible con Calendar / iCal en OS X (señalado por NSGod en los comentarios a continuación) similar al esquema de URL para abrir la aplicación iCal en una fecha o evento? :

// Launches iCal (works at least with 10.6+) [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"ical://"]];