Agenda de direcciones ya se coordina con iCal para crear eventos basados en la fecha del campo de cumpleaños de cualquier contacto. Si todo lo que necesitas son alarmas, entonces sólo necesitas una forma de añadir alarmas a estos eventos.
El problema es que la interfaz de usuario de iCal presenta el calendario como si fuera de sólo lectura. Pero para AppleScript, el calendario no es realmente de sólo lectura. Puedes utilizar AppleScript para añadir alarmas a los eventos del calendario "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á, efectivamente, de que todos los cumpleaños tengan una alarma. † Parece que Agenda de direcciones sólo realiza cambios mínimos cuando actualiza un evento de cumpleaños para un nombre o una fecha de cumpleaños modificados; las alarmas persisten a través de las actualizaciones de Agenda de direcciones pero esto puede no ser fiable ya que Libretas de direcciones "es la dueña de estos eventos y puede borrarlos y recrearlos por completo cada vez que sienta la necesidad de hacerlo.
No conozco una forma oficial de ser notificado de Agenda de direcciones pero, como sugiere la otra respuesta, podrías conectar una Acción de Carpeta a la carpeta que contiene los eventos del calendario "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 se trata de un detalle interno, puede no ser fiable en diferentes versiones del sistema operativo. Todo lo anterior fue desarrollado y probado en Mac OS X 10.6.8.
Alternativamente, ya que el programa anterior asegura que cada cumpleaños tiene una alarma, podrías simplemente organizarlo para que se ejecute una vez al día o una vez al iniciar la sesión (puedes usar un evento de iCal con una alarma "Ejecutar script", o guardar el programa como una aplicación y establecerlo como un elemento de inicio de sesión).
Crear tus propios eventos (en tu propio calendario) es ciertamente posible, pero mantenerlos sincronizados con los datos de cumpleaños puede ser complicado (la búsqueda por "nombre y fecha" no suele ser suficiente porque el usuario podría cambiar cualquiera de ellos, y tu programa de "hacer alarmas" podría no ser capaz de determinar los valores originales para cuando sepa que un contacto concreto ha sido actualizado con un nuevo nombre o fecha de cumpleaños). Agenda de direcciones resuelve este problema codificando el identificador único interno del contacto en la URL que guarda en cada evento de cumpleaños url
ya que el calendario es de "sólo lectura" y no tiene que preocuparse de que un usuario cambie o borre sus URLs especiales, por lo que puede confiar en que sean precisas.
† Eliminamos todas las alarmas existentes suponiendo que todas las alarmas son "nuestras" ya que Agenda de direcciones no añade alarmas por sí mismo, y iCal no permite a los usuarios añadir alarmas. Desgraciadamente, no hay ninguna propiedad extra donde podamos añadir algún tipo de identificador único a la propia alarma (aunque si la hora exacta de la alarma no es importante, podría ser posible codificar alguna 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 comprobar las alarmas existentes para ver si coinciden con nuestra configuración de alarma deseada.