3

短いバージョン: アプリが削除されたときに、アプリによって設定されたヘルパー ツール (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.shApple のサンプルは、明らかに開発中にのみ使用されることを意図したスクリプトを除いて、アンインストールについて沈黙しています。アプリが実行されていない間はこのヘルパーは必要ないため、本格的な起動デーモンとしてインストールするのは少しやり過ぎですが、パスワード プロンプトでユーザーを繰り返し悩ませることも避けたいと考えています。さらに、Apple は、SMJobBless()最近よりも管理者権限でコードを実行する他の形式を推奨していません。たとえば、SMJobSubmit()非推奨とマークされています。

では、どうすれば後片付けができるのでしょうか。

を見つけましSMJobRemove()たが、(a) 私たちの場合はいつそれを呼び出すのでしょうか - .app バンドルの削除でコードを実行することはできませんか? (b)実際にはクリーンアップされていないようです

私が考えることができる唯一の2つのことは、ひどく満足のいくものではありません:

  1. ある種のアンインストーラー アプリまたはスクリプト。しかし、それもかなり醜いようです。
  2. 心配する必要はありません。ユーザーがアプリを削除するときは、混乱したままにしておくだけです。
4

4 に答える 4

1

考えられる解決策の 1 つは、.app バンドルにアンインストーラー スクリプトまたはプログラムを含めることです。

次に、この小さなツールのパスを (IPC 経由で) ヘルパー ツールに渡し、アンインストーラーを実行して、それ自体を削除することができます。コンポーネントが正しい順序で削除されるように注意する必要がありますが、機能させることができます。

于 2016-10-25T03:47:11.903 に答える
0

あなたが今持っている唯一の解決策は、ディスクから特権ヘルパーを物理的に削除するか、そのためのアンインストーラーを構築するために、あなたが言及したアンインストールシェルコードを使用することだと思います. いずれにしても、ユーザーにパスワードの入力を求める必要があります。これは、システムへの特権アクセスを必要とするすべてのインストーラー/アンインストーラーが行うことであり、非常に正当な理由があります。そのため、特権ヘルパーを使用することをペストのように避けていますが、本当に必要な場合があることは理解しています。このようなヘルパーをユーザーのシステムに残すのは良くないと思います。ユーザーが次回コンピューターを起動したときにリロードするからです。

ServiceManagement.h ヘッダーを確認したところ、SMJobRemove は将来的に libxpc を通じて利用可能になる API に置き換えられると記載されています。(時には、ドキュメンテーションでは得られない追加情報を取得するためにヘッダーにアクセスする必要があります。) うまくいけば、この約束された代替品がそれをアンインストールしてくれることを願っています。ただし、バグ レポートを提出して、その機能強化をお願いしたいと思います。

于 2016-10-11T22:44:39.230 に答える
0

Apple は、インストールされたヘルパー ツールをアンインストールするための API を提供しておらず、SMJobBless自動的にアンインストールすることもありません。macOS が自動的にアンインストールを行わない理由については、macOS には基本的に「インストール」という統一された概念がないためだと推測されます。アプリを /Applications (およびその他のいくつかの場所) に配置するのが慣例ですが、アプリを配置して、外部ドライブやネットワーク ドライブを含むシステム上のどこからでも実行することは完全に有効です。たとえば、アプリがインストールされているドライブが切断されたためにアプリが消えた場合、macOS はヘルパー ツールをアンインストールする必要がありますか?

アンインストール方法に関しては、ルート権限が必要なため、現実的にはヘルパー ツール自体にアンインストールを実行させるのが最も簡単なオプションです。アプリを XPC 経由でヘルパーに自身をアンインストールするように指示することができます。これを行う方法のSwift の例を次に示します。これはSwiftAuthorizationSampleの一部です。基本的な考え方は次のとおりです。

  • コマンド ライン ツールを使用しlaunchctlてヘルパー ツールをアンロードする
  • ヘルパー ツールの実行可能ファイルを削除する
  • ヘルパー ツール launchd plist を削除します。

launchctlただし、実行中のプロセスをアンロードできないため、少し複雑になります。

于 2021-10-28T07:58:33.540 に答える