Sổ địa chỉ đã phối hợp với iCal để tạo các sự kiện dựa trên ngày trong bất kỳ trường sinh nhật nào của người liên hệ. Nếu tất cả bạn chỉ cần báo động, thì bạn chỉ cần một cách để thêm báo động cho các sự kiện này.
Điều hấp dẫn là giao diện người dùng của iCal trình bày lịch như thể nó chỉ đọc. Nhưng với AppleScript, lịch không thực sự chỉ đọc. Bạn có thể sử dụng AppleScript để thêm báo thức vào các sự kiện trong lịch Sinh nhật của Sinh nhật:
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
Mỗi khi bạn chạy chương trình này, nó sẽ, một cách hiệu quả, đảm bảo mỗi sinh nhật đều có báo động về nó. † Dường như Address Book làm thay đổi chỉ tối thiểu khi nó cập nhật một sự kiện sinh nhật cho một tên đã thay đổi hoặc ngày sinh nhật; các báo động vẫn tồn tại trên các bản cập nhật từ Sổ địa chỉ , nhưng điều này có thể không đáng tin cậy vì Sổ địa chỉ sở hữu các sự kiện này và hoàn toàn có thể xóa và tạo lại chúng bất cứ khi nào nó cảm thấy cần phải làm như vậy.
Tôi không biết một cách chính thức để được thông báo về các thay đổi trong Sổ địa chỉ , nhưng như người trả lời khác gợi ý, bạn có thể nối một Thư mục hành động vào thư mục chứa các sự kiện cho lịch Sinh nhật của nhật ký. Bạn có thể mở thư mục đó với chương trình này:
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
Vì đây là một chi tiết nội bộ, nó có thể không đáng tin cậy trên các phiên bản HĐH khác nhau. Tất cả những điều trên đã được phát triển và thử nghiệm trên Mac OS X 10.6.8.
Ngoài ra, vì chương trình trên đảm bảo mỗi sinh nhật đều có báo thức, bạn chỉ cần sắp xếp để chạy nó một lần một ngày hoặc một lần khi đăng nhập (bạn có thể sử dụng một sự kiện iCal với báo thức của Run Run Script, hoặc lưu chương trình dưới dạng một ứng dụng và đặt nó làm mục đăng nhập).
Việc tạo các sự kiện của riêng bạn (trong lịch của riêng bạn) chắc chắn là có thể, nhưng việc giữ chúng được đồng bộ hóa với dữ liệu sinh nhật có thể khó khăn (việc tra cứu bằng tên và ngày tên thường là không đủ vì người dùng có thể thay đổi một trong hai điều đó và báo động Chương trình có thể không thể xác định các giá trị ban đầu vào thời điểm nó biết một liên hệ cụ thể đã được cập nhật với một tên mới hoặc ngày sinh nhật). Sổ địa chỉ giải quyết vấn đề này bằng cách mã hóa số nhận dạng duy nhất, nội bộ của liên hệ vào URL mà nó lưu vào url
tài sản của mỗi sự kiện sinh nhật ; vì lịch chỉ có thể đọc được, nên nó không phải lo lắng về việc người dùng thay đổi hoặc xóa các URL đặc biệt của nó, vì vậy nó có thể dựa vào chúng là chính xác.
† Chúng tôi xóa tất cả báo thức hiện có trên giả định rằng tất cả các cảnh báo là “chúng ta” vì Address Book không thêm báo động trên riêng của mình, và iCal không cho phép người dùng thêm báo động. Thật không may, không có tài sản bổ sung nào mà chúng tôi có thể thêm bất kỳ loại định danh duy nhất nào vào báo thức (mặc dù nếu thời gian chính xác của báo thức không quan trọng, có thể mã hóa một số thông tin trong giá trị số của phần bù phút của báo động ). Có vẻ dễ dàng hơn khi chỉ xóa các báo thức và tạo chính xác cái chúng ta muốn thay vì kiểm tra bất kỳ báo thức hiện có nào để xem chúng có khớp với cài đặt báo thức mong muốn hiện tại của chúng tôi không.