dmgに同梱できるドラッグ＆ドロップ用のシンボリックリンクは限定されている話

## 前提
- App Store外でアプリケーションを配布する場合、dmgにアプリケーションに加えてApplicationsのシンボリックリンクを同梱してドラッグ＆ドロップ(以下D&D)を促すようなものを見かけることがあります。
- これを応用して、ファイルを特定のディレクトリにコピーさせる用途に使えないかと思いつきました。
- 具体例としてはフォントファイルを`Library/Fonts`にD&Dでコピーさせるようなdmgを作りたいです。

![](https://i.imgur.com/6QfFFWC.jpg)

## 参考
- [create\-dmgを使ったdmgの作成](https://qiita.com/IKEH/items/061094eaa41bc0c9eda0)
- [create\-dmg](https://github.com/create-dmg/create-dmg)
- [\.dmg with symlinks to /Library/Audio/Plug\-Ins/](https://forum.juce.com/t/dmg-with-symlinks-to-library-audio-plug-ins/52161/1)
- [Macのエイリアスとシンボリックリンクの違いや作成方法](https://webrandum.net/alias-symbolic-link/)

## 作業例
### 前提
- 下図のフォルダ構成で開始します。
    - 参考: [create\-dmgを使ったdmgの作成](https://qiita.com/IKEH/items/061094eaa41bc0c9eda0)

![image](https://i.imgur.com/czniV8r.png)

### シンボリックリンクの作成

```shell
cd /Users/ikeh/Downloads/Test
```

- `/Library/Fonts/`へのシンボリックリンクを作成します。
    - 参考: [Macでシンボリックリンクを作る](https://qiita.com/yamaking/items/9e1f3340e8134c4bcac8)

```shell
ln -s /Library/Fonts/ Fonts
```

- ちなみにユーザフォルダのエイリアス作成はできない？ようです。

```shell
ln -s ~/Library/Fonts/ UserFonts  <- 自分の環境のパスになってしまう
ln -s “~/Library/Fonts/” UserFonts  <- エイリアスの参照エラーとなる
```

### dmgの作成

- dmgを作成します。

```shell
create-dmg \
  --volname “SampleVolume” \
  --window-pos 200 120 \
  --window-size 812 542 \
  --icon-size 100 \
  --icon “対象フォント” 200 190 \
  --icon “Fonts” 600 185 \
  --app-drop-link 600 300 \
  --codesign “Developer ID Application: XXX (xxxxxxxxx)” \
  “SymbolicFontsDemo.dmg” \
  “source_folder/”
```

### dmgの動作確認

- 現在のフォルダ構成は以下の通りなっているはずです。
- 作成したdmgを開きます。

![image](https://i.imgur.com/CZLUyb5.png)

- 下図のようになり、`Fonts`と`Applications`のそれぞれに`対象フォント`をD&Dでコピーできます。

### dmgの動作確認(ダウンロード時)

- 一見うまくいっているのですが、実際はdmgをダウンロードさせた場合にうまく動きません。

![image](https://i.imgur.com/5bGSxpT.png)

- 具体的にはダウンロードしたときに付与される拡張属性`com.apple.quarantine`がついているとうまく動きません。
- `Applications`にはD&Dでコピーできますが、`Fonts`にはD&Dできない状態となります。

```shell
ls -l@ *.dmg
-rw-r--r--@ 1 ikeh  staff  22152 10 27 00:29 SymbolicFontsDemo.dmg
	com.apple.macl	   72
	com.apple.quarantine	   56
```

- 下記が拡張属性`com.apple.quarantine`がついている場合でも、D&Dでコピーができるディレクトリの一覧とのことです。

> https://forum.juce.com/t/dmg-with-symlinks-to-library-audio-plug-ins/52161/28
> ```
> Applications
> Applications/Utilities
> Desktop
> Library/QuickLook
> Library/Screen Savers
> Library/PreferencePanes
> Library/CloudStorage/iCloud Drive/Desktop
> ```

- 実際に拡張属性を削除してみると、うまくコピーができることが確認できます。

```shell
xattr -d com.apple.quarantine SymbolicFontsDemo.dmg
```

- 蛇足にはなるがzipの場合も同様に`Applications`にはコピーできるが`Library/Fonts`にはコピーできない動きとなった。

### 参考

- 以上と同様の話が[\.dmg with symlinks to /Library/Audio/Plug\-Ins/](https://forum.juce.com/t/dmg-with-symlinks-to-library-audio-plug-ins/52161/1)でされているので、いくつか抜粋をメモしておきます。

>Note that ~/Library isn’t an option, as the ~ is resolved at the time the symlink is made so it would be a symlink to /Users/sudara.

- シンボリックリンクの作成に`~`は使えない

>So, quarantine bit … how to disable …
>xattr -d com.apple.quarantine testImage.dmg
>… works.

- 拡張属性`com.apple.quarantine`を取ると動作するという話。

>I noted that it’s strange that I can have a notarized pkg installer that dumps all sorts of stuff everywhere — but a notarized dmg can’t do a drag and drop, even on user authentication.

- signing/notarizationしてもD&Dはできない。

>So, .pkg it is then?

- .pkgが代替案になる…？

## 結論
- dmgに同梱するD&Dでコピーさせるために使えるシンボリックリンクは以下に限られる。
    - 理由は拡張属性`com.apple.quarantine`によりセキュリティが働くため。

```
Applications
Applications/Utilities
Desktop
Library/QuickLook
Library/Screen Savers
Library/PreferencePanes
Library/CloudStorage/iCloud Drive/Desktop
```