NSApplication позволяет вам установить делегата для вашего приложения. Если пользователь перетаскивает файл на значок док-станции, NSApplication вызовет метод
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
вашего объекта делегата, если он реализует любой такой метод. Если содержимое на самом деле не является файлом (например, если пользователь просто выбирает текст в приложении и перетаскивает его на значок в доке), метод делегата
- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication
называется.
См. Ссылка на класс NSApplication
По сути, вы можете просто создать любой объект любого типа (например, простой, который просто наследует NSObject), определить два вышеуказанных метода внутри объекта, а затем в любом месте своего кода запуска приложения, которое вы делаете
whatever = [[YourObject alloc] init];
[[NSApplication sharedApplication] setDelegate:whatever];
И это все. Как только файл или какой-либо другой контент помещается на значок док-станции, вызывается соответствующий метод, который должен обработать этот запрос. Кстати, те же методы вызываются, если ваше приложение связывается с типом файла (например, .myFileType), и пользователь дважды щелкает файл с таким расширением в Finder.
Что действительно происходит за кулисами, так это то, что Launch Services отправляет ваши
приложение «открытые документы» («odoc») Apple Event. NSApplication по умолчанию регистрирует дескриптор для этого события и перенаправляет запрос, вызывая соответствующий метод делегата. Думаю, вы также можете напрямую послушать это событие Apple, но зачем вам это? Работать с Apple Events напрямую неудобно. Если ваше приложение не Какао, а Carbon (plain-C), вам, возможно, придется напрямую обрабатывать Apple Event (я не знаком с Carbon), но в Cocoa Apple уже ловит самые важные для вас Apple Events и конвертирует их в вызовы делегатов или уведомления, которые может прослушивать ваше приложение.