まとめ
- macOS Catalinaから純正アプリが
System/Applications
に配置されるようになっています。 - その他のアプリは従来どおり
Applications
に配置されています。
参考
-
Catalinaでファイルシステムがこう変わる
- 上記の記事が詳しいです。
Catalinaでは、ファイルアクセスをさらに厳格化する。APFS(Apple File System)でフォーマットされたルートボリューム(起動ディスク)はシステム領域とデータ領域に2分割され、そのうちシステム領域は完全にリードオンリーとなる。
純正アプリはシステム領域で読み込み専用、その他のアプリは従来どおりデータ領域に割り振られているとのこと。
確認
macOS 10.15環境
- Finderでは今まで通りのアプリケーションフォルダだけど…
- ターミナルで確認すると、標準のものは
System/Applications
に入っていることが確認できます。
pwd
/System/Applications
ls
App Store.app Contacts.app Image Capture.app Music.app Preview.app System Preferences.app
Automator.app Dictionary.app Launchpad.app News.app QuickTime Player.app TV.app
Books.app FaceTime.app Mail.app Notes.app Reminders.app TextEdit.app
Calculator.app FindMy.app Maps.app Photo Booth.app Siri.app Time Machine.app
Calendar.app Font Book.app Messages.app Photos.app Stickies.app Utilities
Chess.app Home.app Mission Control.app Podcasts.app Stocks.app VoiceMemos.app
- 自分で入れたものは従来どおり
Applications
にあります。
$ pwd
/Applications
ls
CotEditor.app Safari.app Xcode.app
Google Chrome.app Numbers.app Sourcetree.app iMovie.app
...
macOS 10.13環境
- 10.15未満では一緒くたにまとめられていることが確認できます。
cd /Applications
ls
Adobe Acrobat DC Microsoft Outlook.app
Alfred.app Microsoft PowerPoint.app
App Store.app Microsoft Remote Desktop.localized
...
NSSearchPathForDirectoriesInDomainsの挙動変更
概要
- 先述のアプリケーションフォルダが変更されたことに起因して、macOS 10.15から
NSSystemDomainMask
で取得する値が変更されたようです。- macOS 10.15から
/System/Applications
が新たに追加されたからですね。
- macOS 10.15から
-
NSSearchPathForDirectoriesInDomains
はディレクトリの取得の際に使用されています。
参考
- Persistence(2)~ディレクトリパスの入手
- NSSearchPathForDirectoriesInDomains
- NSSearchPathDomainMask
- EZ-NET: iOS のサンドボックスの使い方 : Objective-C プログラミング
Code
NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES);
NSArray *paths2 = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, YES);
NSArray *paths3 = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSNetworkDomainMask, YES);
NSArray *paths4 = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSSystemDomainMask, YES);
NSArray *paths5 = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSAllDomainsMask, YES);
NSLog(@"NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES)\r\n%@", paths1.description);
NSLog(@"NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, YES)\r\n%@", paths2.description);
NSLog(@"NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSNetworkDomainMask, YES)\r\n%@", paths3.description);
NSLog(@"NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSSystemDomainMask, YES)\r\n%@", paths4.description);
NSLog(@"NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSAllDomainsMask, YES)\r\n%@", paths5.description);
macOS 10.15の実行結果
2019-10-25 19:09:31.542660+0900 Sample[64147:308796] Metal API Validation Enabled
2019-10-25 19:09:31.699039+0900 Sample[64147:308796] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES)
(
"/Users/xxx/Library/Containers/jp.co.xxx.sample/Data/Applications"
)
2019-10-25 19:09:31.699109+0900 Sample[64147:308796] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, YES)
(
"/Applications"
)
2019-10-25 19:09:31.699155+0900 Sample[64147:308796] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSNetworkDomainMask, YES)
(
"/Network/Applications"
)
2019-10-25 19:09:31.699194+0900 Sample[64147:308796] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSSystemDomainMask, YES)
(
"/System/Applications"
)
2019-10-25 19:09:31.699242+0900 Sample[64147:308796] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSAllDomainsMask, YES)
(
"/Users/xxx/Library/Containers/jp.co.xxx.sample/Data/Applications",
"/Applications",
"/Network/Applications",
"/System/Applications"
)
macOS 10.13の実行結果
2019-10-25 19:07:25.439859+0900 Sample[20257:3829737] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES)
(
"/Users/username/Library/Containers/jp.co.username.sample/Data/Applications"
)
2019-10-25 19:07:25.439909+0900 Sample[20257:3829737] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, YES)
(
"/Applications"
)
2019-10-25 19:07:25.439932+0900 Sample[20257:3829737] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSNetworkDomainMask, YES)
(
"/Network/Applications"
)
2019-10-25 19:07:25.439948+0900 Sample[20257:3829737] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSSystemDomainMask, YES)
(
"/Applications"
)
2019-10-25 19:07:25.439973+0900 Sample[20257:3829737] NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSAllDomainsMask, YES)
(
"/Users/username/Library/Containers/jp.co.username.sample/Data/Applications",
"/Applications",
"/Network/Applications"
)
- もし
Application
のパスが取得したいのにパラメータでNSSystemDomainMask
を指定していたら、期待する動作と異なっちゃうので注意です。