NSWorkspace имеет метод open(_:withAppBundleIdentifier: [...] )
:
Открывает один или несколько файлов из массива URL-адресов.
func open(_ urls: [URL],
withAppBundleIdentifier bundleIdentifier: String?,
options: NSWorkspace.LaunchOptions = [],
additionalEventParamDescriptor descriptor: NSAppleEventDescriptor?,
launchIdentifiers identifiers:) -> Bool
NSApplicationDelegate приложения, которое вы хотите открыть, имеет соответствующие методы, вызываемые для открытия предоставленных вами URL-адресов:
func application(_ sender: NSApplication, openFile filename: String) -> Bool
func application(_ sender: NSApplication, openFiles filenames: [String])
Вернемся к open(_:withAppBundleIdentifier: [...])
, этот метод имеет параметр NSApleEventDescriptor:
additionalEventParamDescriptor descriptor: NSAppleEventDescriptor?
Дополнительные параметры, указанные в дескрипторе в стиле AppleEvent. Например, вы можете использовать этот параметр, чтобы указать дополнительные документы, которые будут открываться при запуске приложения.
Я хотел бы отправить дополнительную информацию в приложение, которое откроет файлы.
Это будет использоваться аналогично словарю userInfo
в уведомлении.
Я создал объект NSAppleEventDescriptor
для представления этой информации. Я могу установить этот дескриптор события в функции NSWorkspace open( ... )
.
Но как мне получить этот дескриптор события в Application Delegate целевого приложения?
Функции application(_: openFile:)
не имеют параметров для дескрипторов событий или какой-либо другой дополнительной информации типа userInfo
.
Код
Основываясь на ответах и других вопросах, я остановился на решении ниже. Теперь я получаю инициированный обработчик для событий Apple. Но событие Apple, которое я устанавливаю в функции NSWorkspace, — это не то, что получено в обработчике! Как вместо этого получить мое мероприятие Apple?
Отправлять
let appleEvent = NSAppleEventDescriptor(eventClass: AEEventClass(kCoreEventClass),
eventID: AEEventID(kAEOpenDocuments),
targetDescriptor: nil,
returnID: AEReturnID(kAutoGenerateReturnID),
transactionID: AETransactionID(kAnyTransactionID))
appleEvent.setDescriptor(NSAppleEventDescriptor(string: "THIS IS A TEST"), forKeyword: keyDirectObject)
let didOpen = AppKit.NSWorkspace.shared.open([URL(fileURLWithPath: "/path/image.png")],
withAppBundleIdentifier: bundleID,
options: [.withErrorPresentation],
additionalEventParamDescriptor: appleEvent,
launchIdentifiers: nil)
Отправлено событие Apple:
<NSAppleEventDescriptor: 'aevt'\'odoc'{ '----':'utxt'("THIS IS A TEST") }>
Получать
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
NSAppleEventManager.shared().setEventHandler(self,
andSelector: #selector(handle(event:replyEvent:)),
forEventClass: AEEventClass(kCoreEventClass),
andEventID: AEEventID(kAEOpenDocuments))
}
@objc func handle(event: NSAppleEventDescriptor?, replyEvent: NSAppleEventDescriptor?) {
guard let event = event,
event.eventClass == AEEventClass(kCoreEventClass) && event.eventID == AEEventID(kAEOpenDocuments) else {
return
}
guard let additionalEventParamDescriptor = event.paramDescriptor(forKeyword: keyAEPropData) else {
return
}
guard let directObject = additionalEventParamDescriptor.paramDescriptor(forKeyword: keyDirectObject) else {
return
}
print(directObject)
}
}
Полученное событие Apple:
<NSAppleEventDescriptor: 'aevt'\'odoc'{ '----':[ 'bmrk'(888/$626F6F6B7803000000000 [....] 00000AC01000000000000...$) ] }>
odoc
дополнительный параметр. ‹‹‹ - person pkamb   schedule 19.08.2019AppleEvents failed to encode extension for /Users/user/Desktop, err=Operation not permitted/1
- это одно из мест назначения, которое я отправляю в сценарии Apple... - person pkamb   schedule 20.08.2019~'prdt'
выглядит как passThruParams Указатель на Дескриптор события Apple, который передается нетронутым как необязательный параметр с ключевым словомkeyAEPropData ('prdt')
в событии Apple, отправляемом каждому запущенному или активированному приложению. - person pkamb   schedule 21.08.2019