1

短いバージョン:アプリを削除すると、アプリ(SMJobBless()など)で設定されたヘルパーツールを削除できますか?もしそうなら、どうですか?SMJobBlessヘルパーを含むユーザが削除したときに.appでインストールされたアイテムをアンインストールする

ロングバージョン:私たちは、残念ながら開発している

の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は最近、SMJobBless()よりも管理者特権を持つ他の形式のコードを実行することをアドバイスしています。例えば、SMJobSubmit()は推奨されなくなりました。

私たちは自分自身の後にどのようにきれいにするのですか?

SMJobRemove()が見つかりましたが、(a)その場合はいつ呼び出すのですか.appのバンドル削除でコードを実行することはできませんか? (b)it doesn't actually seem to clean up

私は考えることができる唯一の2つの物事がひどく満足ではありません。

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

答えて

0

Apple開発者フォーラムのhttps://forums.developer.apple.com/thread/66821にも同様の質問があります.Appleによる推奨は手動でのアンインストールメカニズムであり、ユーザーがこれをしないとできるだけ少ないリソースを消費します。

Apple DTSのスタッフは、特権打ち上げデーモンで自己アンインストールメカニズムを実装し、XPC経由でアプリから起動されることを推奨しています。これが私たちが進めていることです。

0

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

私はServiceManagement.hヘッダーを確認しましたが、SMJobRemoveは今後libxpcで使用できるAPIに置き換えられると述べています。 (時には、ドキュメントがあなたに与えない余分な情報を得るためにヘッダーに行く必要があることもあります)。この約束された取り替えは、私たちのためにアンインストールされることを願っています。しかし、私はバグレポートを提出し、その強化を頼んでいます。

+0

私が言及したように、特権ヘルパーツールは、XPCコマンドを受信するとオンデマンドでのみ回転します。したがって、少なくとも必要とされていないときはランタイムリソースを使用しません。しかし、はい、私はそれがユーザーのシステムにファイルを残すことは理想的ではない、私の質問に同意します。 – pmdj

1

あなたが検討できる1つの解決策は、アンインストールスクリプトまたはプログラムを.appバンドルに含めることです。

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

+0

このための帯域外スクリプトは、あまりにも複雑でエラーが発生しやすいようです。 (おそらくセキュリティリスクですか?)ヘルパーツールの以前に昇格された特権を使用してアンインストールを実行するのは良いアイデアですが、これは私たちが進めていることであり、Appleが推奨するものです。スクリプトや外部の実行可能ファイルではなく、ヘルパーツールのアンインストールをハードコーディングしているだけです。 – pmdj

関連する問題