繁体   English   中英

从CLI App发送NSUserNotification处理点击事件

[英]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配套应用程序之间的中介。

无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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM