Mac Mountain Lion从CLI应用程序发送通知

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mac Mountain Lion从CLI应用程序发送通知相关的知识,希望对你有一定的参考价值。

如何从命令行应用程序向通知中心发送通知?到目前为止我的尝试编译和运行,但没有成功通知我。

#import <Cocoa/Cocoa.h>

int main(int argc, const char * argv[]) {
    NSLog(@"Running notifications");

    NSUserNotification *note = [[NSUserNotification alloc] init];
    [note setTitle:@"Test"];
    [note setInformativeText:@"Woot"];

    NSUserNotificationCenter *center = [NSUserNotificationCenter defaultUserNotificationCenter];
    [center scheduleNotification: note];

    return 0;
}

我然后编译如下:

clang -framework cocoa /tmp/Notes.m

我明白了

 2012-07-29 16:08:35.642 a.out[2430:707] Running notifications

作为输出,但没有通知:(

这是一个因素吗?

答案

我发现NSUserNotificationCenter[[NSBundle mainBundle] bundleIdentifier]返回正确的标识符时起作用。所以,我写了一些你可以在https://github.com/norio-nomura/usernotification找到的调色代码

它可以发送没有应用程序包的NSUserNotification

另一答案

虽然我没有找到任何关于此的具体文档,但我认为您需要成为一个应用程序(包)来发送通知。请注意,通知中心用户界面始终显示发出通知的应用的名称和图标。使用命令行工具是不可能的。

但似乎并不需要代码签名。

也许您可以编写一个帮助应用程序,它只是发送通知,并且只是通过命令行工具与您的帮助应用程序通信(例如使用NSDistributedNotificationCenter)。

另一答案

我不确定,但也许scheduleNotification调用是异步的,你的应用程序在任何事情发生之前就会退出。 尝试添加:

[[NSRunLoop currentRunLoop] run];

到主要结束。

另一答案

github上已有终端通知程序:https://github.com/julienXX/terminal-notifier

和README说:

它当前打包为应用程序包,因为NSUserNotification不能使用“基础工具”。雷达:// 11956694

另一答案

这就是我必须要做的。注意像这样的runloop有一个非常微小的延迟。为了看到该通知,有必要。

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

但是,您可能会注意到它显示的是终端图标而不是漂亮的图标。为了解决这个问题,有一个记录不完整的技术。不幸的是,使用这种技术,我不知道如何将它链接到我自己的自定义图标 - 仅限于已安装的应用程序图标。

  1. 将Info.plist文件添加到项目中。如果您的项目名为acme,通常XCode会在您的项目中创建一个名为acme的黄色文件夹,并将您的文件放在那里。所以,在那里添加一个Info.plist,不要忘记在Info中大写我。顺便说一句,不要担心使用CLI应用程序分发Info.plist文件 - 它会自动捆绑到二进制文件本身。
  2. 接下来,打开Info.plist并添加一个新项目。它会提示您输入一些默认项目。选择捆绑标识符。现在,在此键的值部分,将其设置为Applications文件夹中已安装应用程序的有效包标识符。所以对我来说,我的LaunchDaemon是需要发送通知的命令行应用程序,我有一个GUI应用程序在/ Applications文件夹中与它配对(为了这里的缘故)为/Applications/Acme.app。因此,在Acme.app的Info.plist文件中,我有了现有的com.acme.myapp包标识符。同样,该GUI应用程序上已经有一个图标。因此,我将我的CLI应用程序的Info.plist文件包标识符中的值设置为com.acme.myapp,以便它将使用该图标。现在,如果需要,您也可以将其设置为com.apple.finder,它将获取Finder图标。 (顺便说一句,如果您知道如何将图标与CLI应用程序本身捆绑在一起,而不是从其他已安装的应用程序中借用它,那么请告诉我。)
  3. 现在,进入您的构建设置并使用搜索框并输入“infoplist”。您将看到一个名为“Info.plist文件”的项目。将其设置为文件的相对文件夹路径。所以,记得当我提到我的项目有一个黄色的“acme”文件夹,我的Info.plist文件在里面?因此,我所要做的只是在第二列(左边的一个说“已解决”)和第三列下输入“acme / Info.plist”。
  4. 现在,在构建设置中,搜索“创建信息”。您将看到一个条目“在二进制中创建Info.plist节”。在第二列和第三列中,将其设置为是。

此问题的另一个问题是,当您单击警报时,它会启动命令行应用程序而不是您可能要加载的GUI应用程序。

以上是关于Mac Mountain Lion从CLI应用程序发送通知的主要内容,如果未能解决你的问题,请参考以下文章

sh Mac OS X 10.7 / 10.8 / 10.9(Lion / Mountain Lion / Mavericks)Bootstrapping

Xcode 4.5.2 在 Mac OS X Mountain Lion 上不断崩溃?

OpenCV可以安装在Mac Mountain Lion上的python virtualenv中吗

Mac OS X Mountain Lion 10.8 中的 Firefox X11

在 Mac OS 10.6 (Snow Leopard)、10.7 (Lion)、10.8 (Mountain Lion) 上激活 PHP 和 MySQL 的最简单方法?

如何在 Mac OS X Mountain Lion 上编译 libnoise