これは私がしなければならなかったことです。そのような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]];
ただし、これにより、素敵なアイコンではなく端末アイコンが表示されることに気付くかもしれません。これを修正するために、十分に文書化されていない手法があります。ただし、この手法では残念ながら、自分のカスタムアイコンにリンクする方法がわかりません。インストールされているアプリケーションアイコンにのみリンクします。
Info.plistファイルをプロジェクトに追加します。プロジェクトがacmeと呼ばれる場合、通常、XCodeはプロジェクトにacmeという黄色のフォルダーを作成し、そこにファイルを配置します。したがって、そこにInfo.plistを追加し、InfoでそのIを大文字にすることを忘れないでください。ところで、CLIアプリでそのInfo.plistファイルを配布することについて心配する必要はありません-それは自動的にバイナリ自体にバンドルされます。
次に、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アイコンが取得されます。(ところで、
次に、ビルド設定に移動し、検索ボックスを使用して「infoplist」と入力します。「Info.plistファイル」というアイテムが表示されます。ファイルの相対フォルダパスに設定します。それで、私のプロジェクトに黄色の「acme」フォルダーがあり、Info.plistファイルがその中にあると言ったときのことを覚えていますか?したがって、私がしなければならなかったのは、2番目の列(左側の列は「解決済み」)と3番目の列の下に「acme/Info.plist」と入力することだけでした。
次に、ビルド設定で「情報の作成」を検索します。「バイナリでInfo.plistセクションを作成」というエントリが表示されます。2列目と3列目で、[はい]に設定します。
この問題のもう1つの問題は、アラートをクリックすると、ロードする可能性のあるGUIアプリケーションではなくコマンドラインアプリが起動することです。