短いバージョン: アプリが削除されたときに、アプリによって設定されたヘルパー ツール (SMJobBless()
など) を削除することは可能ですか? もしそうなら、どのように?
長いバージョン:
残念ながら、私たちが開発している Mac アプリは、時折の操作を実行するために管理者権限を必要とします。また、アプリ自体が実行されていない場合でも、他のアプリのプラグインが接続できるようにバックグラウンド タスクを有効にする必要があります (これは非特権である可能性があります)。 . アプリは開発者 ID 証明書で署名され、App Store 以外でのみ配布されます。
アンインストール時にも、アプリが可能な限り「善良な市民」であることを望んでいます。
バックグラウンド タスクでは、 を使用して作成されたログイン項目を使用していますSMLoginItemSetEnabled()
。XPC メッセージングが機能していないように見えるため (CFMessagePort
代わりに使用しています - 代替の提案を歓迎します)、これは驚くべきことではありませんが、ユーザーがアプリを削除すると、少なくとも次回のログイン時にログイン項目が読み込まれなくなります。システムのどこかにまだその痕跡があると思いますが、.app バンドル内の実行可能ファイルが使用されており、それが消えると、ログイン項目は実行されなくなります。
SMJobBless()
管理者権限を必要とする不定期の操作のために、アプリが を使用してインストールし、名前付き XPC サービスを実装する特権ヘルパー ツールが用意されているため、メイン アプリからメッセージを受信すると、タスクがオンデマンドでスピンアップします。これは、Apple が推奨し、Even Better Authorization Sampleで説明しているものです。
ヘルパー実行可能ファイルは によって にコピーさ/Library/PrivilegedHelperTools/
れSMJobBless()
、埋め込まれた launchd.plist は/Library/LaunchDaemons/
. OS にはどのアプリがヘルパーを「所有」しているかに関する情報がありますが、ユーザーがアプリを削除してもアンインストールされないようです。uninstall.sh
Apple のサンプルは、明らかに開発中にのみ使用されることを意図したスクリプトを除いて、アンインストールについて沈黙しています。アプリが実行されていない間はこのヘルパーは必要ないため、本格的な起動デーモンとしてインストールするのは少しやり過ぎですが、パスワード プロンプトでユーザーを繰り返し悩ませることも避けたいと考えています。さらに、Apple は、SMJobBless()
最近よりも管理者権限でコードを実行する他の形式を推奨していません。たとえば、SMJobSubmit()
非推奨とマークされています。
では、どうすれば後片付けができるのでしょうか。
を見つけましSMJobRemove()
たが、(a) 私たちの場合はいつそれを呼び出すのでしょうか - .app バンドルの削除でコードを実行することはできませんか? (b)実際にはクリーンアップされていないようです。
私が考えることができる唯一の2つのことは、ひどく満足のいくものではありません:
- ある種のアンインストーラー アプリまたはスクリプト。しかし、それもかなり醜いようです。
- 心配する必要はありません。ユーザーがアプリを削除するときは、混乱したままにしておくだけです。