Livro de endereços já coordena com iCal para criar eventos com base na data no campo de aniversário de qualquer contato. Se tudo o que você precisa apenas de alarmes, você só precisa de uma maneira de adicionar alarmes a esses eventos.
O problema é que a interface do usuário do iCal apresenta o calendário como se fosse somente leitura. Mas para o AppleScript, o calendário não é realmente somente leitura. Você pode usar o AppleScript para adicionar alarmes aos eventos no calendário "Aniversários":
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
Toda vez que você executar este programa, ele irá, efetivamente, garantir que todos os aniversários tenham um alarme. † Parece que Livro de endereços faz apenas alterações mínimas quando atualiza um evento de aniversário para um nome alterado ou data de aniversário; os alarmes persistem em atualizações de Livro de endereços , mas isso pode não ser confiável Livros de endereços "Possui" esses eventos e pode excluí-los e recriá-los completamente sempre que sentir a necessidade de fazê-lo.
Eu não sei de uma maneira oficial de ser notificado de Livro de endereços alterações, mas como o outro respondente sugere, você pode ser capaz de ligar uma ação de pasta para a pasta que contém os eventos para o calendário de "aniversários". Você pode abrir essa pasta com 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
Como esse é um detalhe interno, ele pode não ser confiável em diferentes versões do sistema operacional. Todos os itens acima foram desenvolvidos e testados no Mac OS X 10.6.8.
Como alternativa, como o programa acima garante que todos os aniversários tenham um alarme, você pode organizá-lo uma vez por dia ou uma vez no login (você pode usar um evento do iCal com um alarme "Executar script" ou salvar o programa como um aplicativo e configurá-lo como um item de login).
Criar seus próprios eventos (no seu próprio calendário) é certamente possível, mas mantê-los sincronizados com os dados de aniversário pode ser complicado (a pesquisa por “nome e data” geralmente não é suficiente porque o usuário pode alterar qualquer um deles e seu “make” programa de alarmes "pode não ser capaz de determinar os valores originais no momento em que ele sabe que um contato em particular foi atualizado com um novo nome ou data de aniversário). Livro de endereços resolve esse problema codificando o identificador exclusivo interno do contato para o URL que ele salva em cada evento de aniversário url
propriedade; Como o calendário é "somente leitura", ele não precisa se preocupar com a alteração ou a exclusão de URLs especiais de um usuário, de modo que ele pode confiar na precisão deles.
† Excluímos todos os alarmes existentes no pressuposto de que todos os alarmes são "nossos" Livro de endereços não adiciona alarmes sozinho e iCal não permite que os usuários adicionem alarmes.
Infelizmente, não há nenhuma propriedade extra em que possamos adicionar qualquer tipo de identificador exclusivo ao alarme em si (embora, se a hora exata do alarme não for importante, talvez seja possível codificar algumas informações no valor numérico da compensação do minuto do alarme ).
Parece mais fácil excluir os alarmes e criar exatamente o que queremos, em vez de verificar os alarmes existentes para ver se eles correspondem à nossa configuração de alarme atual desejada.