在OS X上以编程方式打开通知中心

时间:2015-03-13 12:51:31

标签: macos cocoa osx-yosemite notificationcenter

有没有办法在Cocoa app上打开OS X上的Notification Center? 我们尝试启动通知中心应用,但这不起作用。 我们的应用程序没有沙盒,因此我们可以做任何必要的事情。

2 个答案:

答案 0 :(得分:1)

您可以使用ScriptingBridge打开它,但它不是官方API,因此有一天它可能会中断。 这有点奇怪,但仅适用于沙盒应用。如果您的应用未加沙盒,则需要辅助功能访问。

1。生成头文件

打开终端并运行以下命令:

cd ~/Desktop/
sdef /System/Library/CoreServices/System\ Events.app | sdp -fh --basename SystemEvents

复制文件" SystemEvents.h"从您的桌面到您的项目。 Xcode将在此文件中显示一些错误或警告。只需删除这些行。

2。导入ScriptingBridge框架并生成头文件。

#import <ScriptingBridge/ScriptingBridge.h>

#import "SystemEvents.h"

3。添加代码

SystemEventsApplication *systemEventsApp = (SystemEventsApplication *)[[SBApplication alloc] initWithBundleIdentifier:@"com.apple.systemevents"];
SystemEventsApplicationProcess *sysUIServer = [systemEventsApp.applicationProcesses objectWithName:@"SystemUIServer"];

SystemEventsMenuBarItem *item = nil;
for (SystemEventsMenuBar *menuBar in sysUIServer.menuBars) {
    item = [menuBar.menuBarItems objectWithName:@"Notification Center"];
    if (item != nil && [item.name isEqualToString:@"Notification Center"])
        break;
}

[item clickAt:nil];

如果您确定菜单栏未来不会发生变化,您也可以使用此代码替换第4-9行:

SystemEventsMenuBarItem *item = [[[sysUIServer.menuBars objectAtLocation:@2] menuBarItems] objectWithName:@"Notification Center"];

4。添加沙箱的临时例外

打开您的项目.entitlements文件并添加&#34; com.apple.security.temporary-exception.apple-events&#34;作为一个数组。添加&#34; com.apple.systemevents&#34; as String。


切换到今日视图

这要求您的应用具有辅助功能访问权限,因此无法在沙盒应用中工作。您只需调用此脚本而不是使用ScriptingBridge:

tell application "System Events"
    click menu bar item "Notification Center" of menu bar 2 of application process "SystemUIServer"
    click radio button "Today" of radio group 1 of window "NotificationTableWindow" of application process "NotificationCenter"
end tell

答案 1 :(得分:0)

不,遗憾的是,没有支持打开通知中心。据说是因为如果没有他们想要打开它就不会让用户打开