[英]Handling Click Events with NSUserNotification Sent from CLI App
我已经在Objective C中创建了OSX命令行应用程序,它现在会触发侧边栏通知事件,如下所示:
NSUserNotification *n = [[NSUserNotification alloc] init];
n.title = @"My Title";
n.subtitle = @"my subtitle";
n.informativeText = @"some informative text";
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:n];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
我什至使用这种技术使它使用另一个应用程序的图标,而不是黑色的终端图标。
但是,现在的麻烦是,当您单击该项目时,它将启动命令行应用程序,而不是我想要的应用程序。 如何单击侧边栏通知以启动我的单独GUI应用程序?
编辑 :也许我需要使用AppleScript告诉我的CLI应用程序调用我的GUI应用程序并指示它发送通知? 这样,事件委托将设置为GUI应用程序,而不是CLI应用程序。 如果是这样,我既不知道如何启动AppleScript并将消息传递给我的GUI应用程序,也不知道GUI应用程序如何读取该消息。
解决的办法是您不要这样做。 如果您有一个CLI应用程序需要向用户发布边栏通知,并且当用户单击它时,它会打开一个GUI伴随应用程序,那么有两种方法可以处理此问题:
•使您的GUI应用程序可编写脚本,以便它可以从CLI应用程序接收AppleScript消息并对其采取行动(例如发送边栏通知)。 这在这里解释。 这是最优雅的技术。
•或者,您可以按照以下示例制作一个无GUI的Cocoa应用程序,该应用程序充当CLI应用程序和GUI配套应用程序之间的中介。
1.创建所谓的无GUI Cocoa应用程序 ,该应用程序将充当CLI应用程序和GUI应用程序之间的中介。 如果您创建了CLI应用程序,则可以避免打开丑陋的终端窗口。 脚步:
一种。 创建一个新的默认Cocoa应用程序。
b。 从Info.plist中删除NSMainNibFile
条目。
C。 删除XIB文件和默认的AppDelegate内容(.m,.h)。
d。 在main()函数中,在main.m中注释掉对NSApplicationMain的调用。
e。 将LSUIElement键添加到您的Info.plist并将其设置为YES。
2.通过将已编译的GUI应用程序中的AppIcon.icns文件复制到该main-m文件所在的同一目录中的无GUI应用程序中,为该无GUI应用程序设置图标。 然后,在没有GUI的应用程序的Info.plist中,将CFBundleIconFile设置为AppIcon。 然后,对您的项目进行清理,以便它将使用此新图标。 注意-XCode在无法正确显示图标的地方可能会产生奇怪的效果,但是当您在Finder中查看它时就可以了。
3.将无GUI的Cocoa应用程序的main.m设置为此:
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
NSString *sTitle = @"";
NSString *sSubTitle = @"";
NSString *sText = @"";
try {
sTitle = @(argv[1]);
sSubTitle = @(argv[2]);
sText = @(argv[3]);
} catch (...) {
}
if ([sTitle isEqualToString:@""]) {
NSString *script = @"tell app \"";
// change me to your real GUI application path
script = [script stringByAppendingString:@"/Applications/Example.app"];
script = [script stringByAppendingString:@"\" to activate"];
NSAppleScript *appleScript = [[NSAppleScript alloc] initWithSource:script];
[appleScript executeAndReturnError:nil];
exit(0);
}
NSUserNotification *n = [[NSUserNotification alloc] init];
n.title = sTitle;
if (![sSubTitle isEqualToString:@""]) {
n.subtitle = sSubTitle;
}
n.informativeText = sText;
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:n];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
return 0;
}
4.编译此应用程序,并将此应用程序文件夹粘贴到/Applications/Example.app/Contents/Resources文件夹中(当然要更改它)。
5.现在,您可以使用CLI应用程序中的以下代码发送通知,并将使用GUI应用程序中使用的图标,这非常令人愉快。 当用户单击通知时,它将打开您的GUI应用程序,而不是没有GUI的应用程序。 (实际上,当您单击侧边栏通知时,它会打开无GUI应用程序,但这是不可见的。无GUI应用程序看不到传递给它的参数,因此它不会显示其他通知。相反,它知道通过AppleScript启动GUI应用程序。)
#include <string>
std::string sTitle = "Sample Title";
std::string sSubTitle = "sample subtitle";
std::string sText = "some text";
std::string sCmd = "open -a \"";
// change me to the path of your GUI application
sCmd += "/Applications/Example.app";
// change notify.app to the name of your GUI-less application
sCmd += "/Contents/Resources/notify.app";
sCmd += "\" --args ";
sCmd += "\"" + sTitle + "\" ";
sCmd += "\"" + sSubTitle + "\" ";
sCmd += "\"" + sText + "\"";
system(sCmd.c_str());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.