Rubrica già coordina con iCal per creare eventi in base alla data nel campo del compleanno di qualsiasi contatto. Se hai solo bisogno di allarmi, hai solo bisogno di un modo per aggiungere allarmi a questi eventi.
Il problema è che l'interfaccia utente di iCal presenta il calendario come se fosse di sola lettura. Ma per AppleScript, il calendario non è in realtà di sola lettura. Puoi utilizzare AppleScript per aggiungere allarmi agli eventi nel calendario "Compleanni":
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
Ogni volta che esegui questo programma si verificherà, in modo efficace, che ogni compleanno abbia un allarme su di esso. † Sembra che Address Book apporti solo modifiche minime quando aggiorna un evento di compleanno per un nome o una data di compleanno cambiati; gli allarmi persistono attraverso gli aggiornamenti da Address Book , ma questo potrebbe non essere affidabile poiché Address Book "possiede" questi eventi e potrebbe eliminarli e ricrearli completamente ogni volta che sentisse il bisogno per farlo.
Non conosco un modo ufficiale per ricevere le modifiche Address Book , ma come suggerisce l'altro, potresti essere in grado di collegare un'azione Folder alla cartella che contiene gli eventi per il calendario "Compleanni". Puoi aprire quella cartella con questo programma:
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
Poiché si tratta di un dettaglio interno, potrebbe non essere affidabile tra diverse versioni del sistema operativo. Tutto quanto sopra è stato sviluppato e testato su Mac OS X 10.6.8.
In alternativa, poiché il programma di cui sopra garantisce che ogni compleanno abbia un allarme, puoi semplicemente organizzarlo per eseguirlo una volta al giorno o una volta al login (puoi usare un evento iCal con un allarme "Esegui script" o salvare il programma come un'applicazione e impostarla come elemento di accesso).
Creare i propri eventi (nel proprio calendario) è certamente possibile, ma mantenerli sincronizzati con i dati del compleanno può essere complicato (la ricerca per "nome e data" di solito non è sufficiente perché l'utente potrebbe cambiare uno di questi e il tuo programma "make alarms" potrebbe non essere in grado di determinare i valori originali quando sa che un particolare contatto è stato aggiornato con un nuovo nome o data di compleanno). Address Book risolve questo problema codificando l'identificatore univoco interno del contatto nell'URL che salva nella proprietà url
di ogni evento di compleanno; poiché il calendario è "di sola lettura" non deve preoccuparsi di un utente che modifica o elimina i suoi URL speciali, quindi può fare affidamento sulla loro accuratezza.
† Cancelliamo tutti gli allarmi esistenti partendo dal presupposto che tutti gli allarmi sono "nostri" poiché Address Book non aggiunge allarmi da solo e iCal non consente agli utenti di aggiungere allarmi.
Sfortunatamente, non esiste alcuna proprietà aggiuntiva in cui potremmo aggiungere qualsiasi tipo di identificatore univoco all'allarme stesso (sebbene se l'ora esatta dell'allarme non sia importante, potrebbe essere possibile codificare alcune informazioni nel valore numerico dell'offset dei minuti dell'allarme ).
Sembra più facile eliminare gli allarmi e creare esattamente quello che vogliamo invece di controllare eventuali allarmi esistenti per vedere se corrispondono alla nostra attuale impostazione di allarme desiderata.