13

コマンドラインアプリから通知センターに通知を送信するにはどうすればよいですか?これまでの私の試みはコンパイルして実行しますが、通知に成功しません。

#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

出力として、ただし通知なし:(

コード署名はこれの要因ですか?

4

5 に答える 5

19

適切な識別子を返すとNSUserNotificationCenter機能することがわかりました。だから、私はあなたがhttps://github.com/norio-nomura/usernotification[[NSBundle mainBundle] bundleIdentifier]で見つけることができるいくつかのスウィズリングコードを書きました

NSUserNotificationアプリケーションバンドルなしで送信できます。

于 2013-02-05T01:06:11.613 に答える
3

これに関する具体的なドキュメントは見つかりませんでしたが、通知を配信するにはアプリケーション(バンドル)である必要があると思います。通知センターのUIには、通知の送信元のアプリの名前とアイコンが常に表示されることに注意してください。これは、コマンドラインツールでは不可能です。

ただし、コード署名は必要ないようです。

おそらく、通知を配信し、コマンドラインツールからヘルパーアプリと通信するだけのヘルパーアプリを作成することができます(例:を使用NSDistributedNotificationCenter)。

于 2012-07-29T20:23:30.467 に答える
2

確かなことはわかりませんが、scheduleNotificationの呼び出しは非同期であり、何かが発生する前にアプリが終了している可能性があります。
追加してみてください:

[[NSRunLoop currentRunLoop] run];

メインの終わりまで。

于 2012-07-29T20:49:44.797 に答える
2

githubにはすでにターミナル通知機能があります:https ://github.com/julienXX/terminal-notifier

そしてREADMEは言う:

NSUserNotificationは「Foundationツール」からは機能しないため、現在はアプリケーションバンドルとしてパッケージ化されています。レーダー:// 11956694

于 2012-08-13T07:16:25.807 に答える
1

これは私がしなければならなかったことです。そのような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でそのIを大文字にすることを忘れないでください。ところで、CLIアプリでそのInfo.plistファイルを配布することについて心配する必要はありません-それは自動的にバイナリ自体にバンドルされます。

  2. 次に、Info.plistを開き、新しいアイテムを追加します。いくつかのデフォルト項目の入力を求められます。バンドル識別子を選択します。ここで、このキーの値の部分で、アプリケーションフォルダーにインストールされているアプリケーションの有効なバンドル識別子に設定します。したがって、私にとって、LaunchDaemonは通知を送信する必要のあるコマンドラインアプリであり、(ここでは)/Applications/Acme.appという名前の/Applicationsフォルダーにそれと結合するGUIアプリがありました。そのため、Acme.appのInfo.plistファイル内に、com.acme.myappの既存のバンドル識別子がありました。また、そのGUIアプリケーションにはすでにアイコンがあります。そこで、CLIアプリのInfo.plistファイルバンドル識別子の値をcom.acme.myappに設定して、そのアイコンが使用されるようにします。必要に応じて、これをcom.apple.finderに設定することもできます。これにより、Finderアイコンが取得されます。(ところで、

  3. 次に、ビルド設定に移動し、検索ボックスを使用して「infoplist」と入力します。「Info.plistファイル」というアイテムが表示されます。ファイルの相対フォルダパスに設定します。それで、私のプロジェクトに黄色の「acme」フォルダーがあり、Info.plistファイルがその中にあると言ったときのことを覚えていますか?したがって、私がしなければならなかったのは、2番目の列(左側の列は「解決済み」)と3番目の列の下に「acme/Info.plist」と入力することだけでした。

  4. 次に、ビルド設定で「情報の作成」を検索します。「バイナリでInfo.plistセクションを作成」というエントリが表示されます。2列目と3列目で、[はい]に設定します。

この問題のもう1つの問題は、アラートをクリックすると、ロードする可能性のあるGUIアプリケーションではなくコマンドラインアプリが起動することです。

于 2016-04-16T10:43:06.420 に答える