【macOS】 アプリのすっきりアンインストール方法から学ぶ「アプリ関連ファイルの場所」

いまさら調べてみる。まず Apple 公式。


* Lauchpad からアンインストールする

* Finder を使って
  - ゴミ箱にいれる
  - ⌘ ( command ) + ⌫ ( delete )

* アプリ同梱のアンインストールスクリプト

👉 Mac でアプリをアンインストールする - Apple サポート (日本) hatena-bookmark

コマンドラインで。


❯ sudo uninstall file://Applications/Pages.app

👉 How to completely uninstall an app on a Mac and delete all junk files hatena-bookmark

Homebrew のコマンドを使うなら。


❯ brew help uninstall
Usage: brew uninstall, remove, rm [options] installed_formula|installed_cask
[...]

Uninstall a formula or cask.

  -f, --force                      Delete all installed versions of formula.
                                   Uninstall even if cask is not installed,
                                   overwrite existing files and ignore errors
                                   when removing files.
      --zap                        Remove all files associated with a cask.
                                   May remove files which are shared between
                                   applications.
      --ignore-dependencies        Don't fail uninstall, even if formula is a
                                   dependency of any installed formulae.
      --formula, --formulae        Treat all named arguments as formulae.
      --cask, --casks              Treat all named arguments as casks.
  -d, --debug                      Display any debugging information.
  -q, --quiet                      Make some output more quiet.
  -v, --verbose                    Make some output more verbose.
  -h, --help                       Show this message.

実際、今現在、私も使っているが、このアプリがベストに思える。


👉 AppCleaner hatena-bookmark

サードパーティのアプリなのですが、

どのファイルを削除してるのだろうか

と思いました。

 

🤔 手動で完全にアンインストールする方法

実際にはやらないけども、アプリの構造やインストーラのしくみの理解にもつながるはず。

👉 t18n/uninstall-cli: Open-sourced CLI tool to uninstall application on MacOS hatena-bookmark

アプリ(.app)のパス

から

「アプリ名」と「アプリ識別子」

を取得してから、

可能性のあるディレクトリを走査して、

見つけたファイルが削除の対象。

キャッシュやテンポラリなディレクトリも操作しています。


❯ app=/Applications/Numbers.app

❯ /usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" "$app/Contents/Info.plist"
com.apple.iWork.Numbers

❯ echo $(basename $app .app)
Numbers

❯ find "$HOME/Library/Application Scripts" -iname "*com.apple.iWork.Numbers*" -maxdepth 1 -prune
/Users/me/Library/Application Scripts/com.apple.iWork.Numbers
/Users/me/Application Scripts/com.apple.iWork.Numbers.NumbersNotificationServiceExtension

❯ find "$HOME/Library/Application Scripts" -iname "*Numbers*" -maxdepth 1 -prune
/Users/me/Library/Application Scripts/com.apple.iWork.Numbers
/Users/me/Library/Application Scripts/com.apple.iWork.Numbers.NumbersNotificationServiceExtension

❯ echo $(getconf DARWIN_USER_CACHE_DIR | sed "s/\/$//")
/var/folders/2_/860qd2ks5hg6hp26wg2tmtn40000gn/C

❯ echo $(getconf DARWIN_USER_TEMP_DIR | sed "s/\/$//")
/var/folders/2_/860qd2ks5hg6hp26wg2tmtn40000gn/T

このスクリプトもそうですが、すべてのこのへんの記事の元は以下であることが多いようです。

👉 privacy-guides/how-to-clean-uninstall-macos-apps-using-appcleaner-open-source-alternative/app-cleaner.sh at master · sunknudsen/privacy-guides hatena-bookmark

ということで、アプリに関連するファイルの位置は以下だと言えそうです。


locations=(
  "$HOME/Library"
  "$HOME/Library/Application Scripts"
  "$HOME/Library/Application Support"
  "$HOME/Library/Application Support/CrashReporter"
  "$HOME/Library/Containers"
  "$HOME/Library/Caches"
  "$HOME/Library/HTTPStorages"
  "$HOME/Library/Group Containers"
  "$HOME/Library/Internet Plug-Ins"
  "$HOME/Library/LaunchAgents"
  "$HOME/Library/Logs"
  "$HOME/Library/Preferences"
  "$HOME/Library/Preferences/ByHost"
  "$HOME/Library/Saved Application State"
  "$HOME/Library/WebKit"
  "/Library"
  "/Library/Application Support"
  "/Library/Application Support/CrashReporter"
  "/Library/Caches"
  "/Library/Extensions"
  "/Library/Internet Plug-Ins"
  "/Library/LaunchAgents"
  "/Library/LaunchDaemons"
  "/Library/Logs"
  "/Library/Preferences"
  "/Library/PrivilegedHelperTools"
  "/private/var/db/receipts"
  "/usr/local/bin"
  "/usr/local/etc"
  "/usr/local/opt"
  "/usr/local/sbin"
  "/usr/local/share"
  "/usr/local/var"
  $(getconf DARWIN_USER_CACHE_DIR | sed "s/\/$//")
  $(getconf DARWIN_USER_TEMP_DIR | sed "s/\/$//")
)

アプリを特定するのは、上記スクリプトの

「basename」「CFBundleIdentifier」

のようです。

 

🤔 おまけ

SwiftUI で書かれたアンインストールアプリがありました。

👉 Pearcleaner - Product Information, Latest Updates, and Reviews 2024 | Product Hunt hatena-bookmark

現在絶賛公開中の模様。

オープンソースです。

👉 alienator88/Pearcleaner: A free, source-available and fair-code licensed mac app cleaner hatena-bookmark


【macOS】公証つけて配布する方法 - 2024年版

調べながらやったが、


Product

  ↓

Archive

  ↓

Distrubute App

と進んでいくが、

「Developer ID」

の選択肢が表示されない。

 

🧑🏻‍💻 iOS から macOS に切り替える

ここですか。

Xcode 上部中央で切り替える。

これで、流れとしては、


Product

  ↓

Archive

  ↓

Distrubute App

または、Custom 経由で、


Product

  ↓

Archive

  ↓

Distrubute App

  ↓

Custom


というかんじで、

以前の「Developer ID」での処理は 「Direct Distribution」からいける。

選択肢のラベルが変わった感じか。

あとは Export すればいい。


👉 Notarizing macOS software before distribution | Apple Developer Documentation hatena-bookmark


【macOS】非 App Store アプリの「公証」を確認する方法

Apple 公式の App Store でないサイトで公開してるアプリがありますよね。

少し怖いですよね。

Apple のサービスとして「公証」というしくみがあります。

公証
公証とは、Appleが提供するマルウェアスキャンサービスです。App Store外でmacOS用のアプリを配付したいデベロッパは、配付プロセスの一環として、アプリを提出してスキャンを受けます。Appleはそのアプリをスキャンし、既知のマルウェアが見つからなければ公証チケットを発行します。

👉 macOSでのマルウェアからの保護 - Apple サポート (日本) hatena-bookmark

こんなアプリがあります。

👉 Apparency | User Guide hatena-bookmark

インストールしているアプリの署名や公証を確認するアプリです。

アプリをインストールするのがなんかいやなので

これをコマンドラインでやる方法を調べてみました。


❯ spctl -a -t exec -vvv OneMenu.app

OneMenu.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: Marko Pavlovic (7R2UKFFRJJ)

👉 Signing/notarizing command line tools not build using Xcode| Apple Developer Forums hatena-bookmark


❯ pkgutil --check-signature OneMenu.app

Package "OneMenu.app":
   Status: signed by a certificate trusted by macOS
   Certificate Chain:
    1. Developer ID Application: Marko Pavlovic (7R2UKFFRJJ)
       Expires: 2027-02-01 22:12:15 +0000
       SHA256 Fingerprint:
           59 25 F2 A4 68 42 FE 1C A8 8C 7F 71 D6 86 84 D3 8C 09 20 73 52 D1
           06 CA 12 84 9C 8E 40 FC 02 32
       ------------------------------------------------------------------------
    2. Developer ID Certification Authority
       Expires: 2027-02-01 22:12:15 +0000
       SHA256 Fingerprint:
           7A FC 9D 01 A6 2F 03 A2 DE 96 37 93 6D 4A FE 68 09 0D 2D E1 8D 03
           F2 9C 88 CF B0 B1 BA 63 58 7F
       ------------------------------------------------------------------------
    3. Apple Root CA
       Expires: 2035-02-09 21:40:36 +0000
       SHA256 Fingerprint:
           B0 B1 73 0E CB C7 FF 45 05 14 2C 49 F1 29 5E 6E DA 6B CA ED 7E 2C
           68 C5 BE 91 B5 A1 10 01 F0 24


❯ pkgutil --check-signature YOUR.pkg

Package "Silverlight.pkg":
   Status: signed by a certificate trusted by Mac OS X
   Certificate Chain:
    1. Developer ID Installer: Microsoft Corporation
   SHA1 fingerprint: AE D0 A7 C5 31 01 2B 70 D7 FB 49 5A 23 30 3A 67 05 36 5A 11
   -----------------------------------------------------------------------------
    2. Developer ID Certification Authority
   SHA1 fingerprint: 3B 16 6C 3B 7D C4 B7 51 C9 FE 2A FA B9 13 56 41 E3 88 E1 86
   -----------------------------------------------------------------------------
    3. Apple Root CA
   SHA1 fingerprint: 61 1E 5B 66 2C 59 3A 08 FF 58 D1 4A E2 24 52 D1 98 DF 6C 60

👉 MacOS App Notarized but cannot be opened · Issue #6025 · electron-userland/electron-builder hatena-bookmark
👉 pkgutilの便利なコマンドをまとめてみた #macOS - Qiita hatena-bookmark


❯ codesign --display -vvv OneMenu.app

Executable=/Users/nishi/Desktop/OneMenu.app/Contents/MacOS/OneMenu
Identifier=com.withmarko.OneMenu
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=7489 flags=0x10000(runtime) hashes=223+7 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha256=d0c0ca9247b1ed0bb12237d8c7164d71157cded3
CandidateCDHashFull sha256=d0c0ca9247b1ed0bb12237d8c7164d71157cded3b738a4880f86219f60bd2e06
Hash choices=sha256
CMSDigest=d0c0ca9247b1ed0bb12237d8c7164d71157cded3b738a4880f86219f60bd2e06
CMSDigestType=2
CDHash=d0c0ca9247b1ed0bb12237d8c7164d71157cded3
Signature size=8932
Authority=Developer ID Application: Marko Pavlovic (7R2UKFFRJJ)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Jul 22, 2024 at 4:54:21
Notarization Ticket=stapled
Info.plist entries=24
TeamIdentifier=7R2UKFFRJJ
Runtime Version=14.5.0
Sealed Resources version=2 rules=13 files=8
Internal requirements count=1 size=216

👉 macOS Catalinaにおけるアプリの「公証(Notarization)」への対応方法 | OPTPiX Labs Blog hatena-bookmark

 

🧑🏻‍💻 まとめ

macOS 「公証」についてはこちら。

👉 ゼロから始めるmacOSアプリの署名と公証 (独自配信用) – hiroakit.com hatena-bookmark

テストにダウンロードアーカイブ使いましたが、

便利な良いアプリです「OneMenu」。

👉 OneMenu for Mac — Marko hatena-bookmark

開発者は YouTube もやっています。


👉 【Mac Menubar アプリ】System Monitoring + Keyboard Cleaning 🧹 + Window Manager = OneMenu hatena-bookmark

 

🧑🏻‍💻 参考