macOS Catalina(10.15)からアプリケーションフォルダが2つに別れています

# まとめ
- macOS Catalinaから純正アプリが`System/Applications`に配置されるようになっています。
- その他のアプリは従来どおり`Applications`に配置されています。

## 参考
- [Catalinaでファイルシステムがこう変わる](https://news.mynavi.jp/article/osxhack-242/)
    - 上記の記事が詳しいです。

>Catalinaでは、ファイルアクセスをさらに厳格化する。APFS(Apple File System)でフォーマットされたルートボリューム(起動ディスク)はシステム領域とデータ領域に2分割され、そのうちシステム領域は完全にリードオンリーとなる。

純正アプリはシステム領域で読み込み専用、その他のアプリは従来どおりデータ領域に割り振られているとのこと。

# 確認
## macOS 10.15環境

-  Finderでは今まで通りのアプリケーションフォルダだけど…

![-w882](https://i.imgur.com/qIMWlbo.jpg)

- ターミナルで確認すると、標準のものは`System/Applications`に入っていることが確認できます。

```shell
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`にあります。

```sh
$ pwd
/Applications
ls
CotEditor.app				Safari.app				Xcode.app
Google Chrome.app			Numbers.app				Sourcetree.app				iMovie.app
...
```

## macOS 10.13環境

- 10.15未満では一緒くたにまとめられていることが確認できます。

```sh
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`が新たに追加されたからですね。
- `NSSearchPathForDirectoriesInDomains`はディレクトリの取得の際に使用されています。

## 参考
- [Persistence（2）～ディレクトリパスの入手](https://secondflush2.blog.fc2.com/blog-entry-682.html)
- [NSSearchPathForDirectoriesInDomains](https://developer.apple.com/documentation/foundation/1414224-nssearchpathfordirectoriesindoma?language=objc)
- [NSSearchPathDomainMask](https://developer.apple.com/documentation/foundation/nssearchpathdomainmask?language=objc)
- [EZ\-NET: iOS のサンドボックスの使い方 : Objective\-C プログラミング](http://program.station.ez-net.jp/special/handbook/objective-c/iphone/feature/sandbox.asp)

## Code

```objc
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の実行結果

```objc
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の実行結果

```objc
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`を指定していたら、期待する動作と異なっちゃうので注意です。