我正在尝试扩展一些Spotify功能(而不是其他客户端)的应用程序。当我在Dock上点击我的图标时,我想显示Spotify的主窗口 - 即使Spotify中的主窗口已关闭。
这是我现在的代码:
- (void) applicationDidBecomeActive:(NSNotification *)notification {
// Causes Spotify to hit the front when selecting it!
[[[NSRunningApplication
runningApplicationsWithBundleIdentifier:@"com.spotify.client"] lastObject]
activateWithOptions:NSApplicationActivateAllWindows];
}
当窗口打开但不在焦点(背景)时它起作用,但在关闭Spotify主窗口时(我常常会这样做),它不起作用。如果它从另一个应用程序关闭,有没有办法重新打开这个窗口?
Spotify图标可以做到这一点(显然)。尝试按下关闭按钮(红色x)并按下图标(它将重新出现)。这可能是从另一个应用程序?
答案 0 :(得分:0)
Dock将reopen
Apple事件发送到您单击的应用程序,然后按其认为合适的方式执行代码。要模拟Dock单击,您需要手动将reopen
事件发送到应用程序。
Apple Documentation on the matter表示reopen
事件的ID为rapp
代码(kAEReopenApplication
)且属于kCoreEventClass
类。
从那里开始,在代码中构建Apple Event并将其发送到应用程序相对简单。请注意,您确实应该从AESendMessage
调用执行一些错误检查,因为如果应用程序未启动,事件可能会失败等等 - 我还没有真正测试过这些情况。
这是我的解决方案。请注意,您需要保留原始代码以将应用程序置于最前面 - Apple Event不会更改应用程序顺序。
NSAppleEventDescriptor *target = [[NSAppleEventDescriptor alloc]
initWithDescriptorType:typeApplicationBundleID
data:[@"com.spotify.client" dataUsingEncoding:NSUTF8StringEncoding]];
NSAppleEventDescriptor *event = [[NSAppleEventDescriptor alloc]
initWithEventClass:kCoreEventClass
eventID:kAEReopenApplication
targetDescriptor:target
returnID:kAutoGenerateReturnID
transactionID:kAnyTransactionID];
AESendMessage(event.aeDesc, NULL, kAEWaitReply | kAENeverInteract, kAEDefaultTimeout);