Libreta de direcciones ya se coordina con iCal para crear eventos según la fecha en el campo de cumpleaños de cualquier contacto. Si solo necesitas alarmas, entonces solo necesitas una manera de agregar alarmas a estos eventos.
El problema es que la interfaz de usuario de iCal presenta el calendario como si fuera de solo lectura. Pero para AppleScript, el calendario no es realmente de solo lectura. Puede usar AppleScript para agregar alarmas a los eventos en el calendario de "Cumpleaños":
on run
(* Warning:
This program will delete all the "display alarms" from the events in the
synthetic "Birthdays" calendar. Usually, there are no alarms on these
events because iCal treats this calendar as if it were read-only.
The calendar is not, however, actually read-only when accessed through
AppleScript. This program deletes all existing "display alarms" for all
birthdays and sets a new one for 13.5 days before the the event
(i.e. noon 14 days before, since the event occurs at midnight).
*)
tell application "iCal"
set bcName to "Birthdays"
set bc to a reference to calendar bcName
if not (exists bc) then
display alert "No “" & bcName & "” calendar!"
return
end if
repeat with e in events of contents of bc
-- make the following conditional if you only want alarms for some birthdays
tell e
delete display alarms
make new display alarm with properties {trigger interval:-13.5 * 24 * 60}
end tell
end repeat
end tell
end run
Cada vez que ejecute este programa, se asegurará de que todos los cumpleaños tengan una alarma. † Parece que Libreta de direcciones solo realiza cambios mínimos cuando actualiza un evento de cumpleaños para un nombre cambiado o fecha de cumpleaños; las alarmas persisten en las actualizaciones de Libreta de direcciones , pero esto puede no ser confiable ya que Libretas de direcciones "posee" estos eventos y podría eliminarlos y recrearlos por completo cada vez que lo sintiera necesario para hacerlo.
No conozco una forma oficial de ser notificado de los cambios de Libreta de direcciones , pero, como sugiere el otro respondedor, es posible que pueda conectar una Acción de carpeta a la carpeta que contiene los eventos. Para el calendario de "Cumpleaños". Puedes abrir esa carpeta con este programa:
tell application "iCal" to set bcuid to uid of calendar "Birthdays"
path to library folder from user domain
tell application "Finder" to open folder "Events" of folder (bcuid & ".calendar") of folder "Calendars" of result
Dado que este es un detalle interno, puede que no sea confiable en las diferentes versiones del sistema operativo. Todo lo anterior fue desarrollado y probado en Mac OS X 10.6.8.
Como alternativa, dado que el programa anterior garantiza que cada cumpleaños tenga una alarma, solo puede organizar su ejecución una vez al día o una vez que inicie sesión (puede usar un evento de iCal con una alarma de "Ejecutar script" o guardar el programa como una aplicación y configurarlo como un elemento de inicio de sesión).
La creación de sus propios eventos (en su propio calendario) es ciertamente posible, pero mantenerlos sincronizados con los datos de cumpleaños puede ser complicado (la búsqueda por "nombre y fecha" por lo general no es suficiente porque el usuario puede cambiar cualquiera de estos, y Es posible que su programa "make alarms" no pueda determinar los valores originales en el momento en que sepa que un contacto en particular se ha actualizado con un nuevo nombre o fecha de cumpleaños). Libreta de direcciones resuelve este problema al codificar el identificador único interno del contacto en la URL que guarda en cada propiedad url
del evento de cumpleaños; Dado que el calendario es de "solo lectura", no tiene que preocuparse por que un usuario cambie o elimine sus URL especiales, por lo que puede confiar en que sean precisos.
† Eliminamos todas las alarmas existentes suponiendo que todas las alarmas son "nuestras" ya que Libreta de direcciones no agrega alarmas por sí sola, y iCal no permite a los usuarios agregar alarmas.
Desafortunadamente, no hay ninguna propiedad adicional en la que podamos agregar cualquier tipo de identificador único a la alarma en sí misma (aunque si la hora exacta de la alarma no es importante, podría ser posible codificar cierta información en el valor numérico del desplazamiento de minutos de la alarma). ).
Parece más fácil simplemente eliminar las alarmas y crear exactamente la que queremos, en lugar de revisar las alarmas existentes para ver si coinciden con nuestra configuración de alarma deseada actual.