关闭时从另一个应用程序打开 Spotify 主窗口

Posted

技术标签:

【中文标题】关闭时从另一个应用程序打开 Spotify 主窗口【英文标题】:Open Spotify main window from another app when closed 【发布时间】:2013-06-04 23:36:35 【问题描述】:

我正在开发一个尝试扩展某些 Spotify 功能的应用程序(而不是其他客户端)。当我的图标在停靠栏上单击时,我想显示 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)并按下图标(它会重新出现)。这可能来自另一个应用程序吗?

【问题讨论】:

【参考方案1】:

Dock 将reopen Apple 事件发送到您单击的应用程序,然后应用程序执行它认为合适的代码。要模拟 Dock 单击,您需要手动将 reopen 事件发送到应用程序。

Apple Documentation on the matter 声明 reopen 事件的 ID 为 rapp 代码 (kAEReopenApplication),并且是 kCoreEventClass 类的一部分。

从那里开始,在代码中构建 Apple 事件并将其发送到应用程序相对简单。请注意,您确实应该从 AESendMessage 调用中进行一些错误检查,因为如果应用程序未启动等事件可能会失败 - 我还没有真正测试过这些情况。

这是我的解决方案。请注意,您需要保留原始代码才能将应用程序置于最前面 - Apple 事件不会更改应用程序顺序。

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);

【讨论】:

谢谢!这完美!不完全确定它的详细工作原理,因此感谢您在答案中添加一些有用的链接! :) 我的应用程序需要 Spotify 才能运行,所以我会研究一些方法来确保它可以运行,也感谢您指出这一点!

以上是关于关闭时从另一个应用程序打开 Spotify 主窗口的主要内容,如果未能解决你的问题,请参考以下文章

React-Native Spotify SDK iOS:关闭身份验证窗口

Cocoa:从另一个窗口创建并关闭一个窗口

从另一个模态打开一个模态并关闭第一个(启动)模态

从另一个弹出窗口打开一个弹出窗口

Bootstrap 3 - 从另一个模式打开模式

kivy - 绑定弹出窗口关闭以从另一个小部件实例中运行