macOSアプリの公証をnotarytoolで行う

## 概要
- `altool`はまもなく廃止となるので、`notarytool`に移行します。

>[Apple、Xcode 13以前のGUIやaltoolによるMacアプリの公証を2023年秋までに終了し、今後はXcode 14以上のGUIやnotarytoolへ移行](https://applech2.com/archives/20220611-new-in-notarization-for-mac-apps.html)
>AppleがXcode 13以前のGUIやaltoolによるMacアプリの公証を2023年秋で終了し、今後はXcode 14以上のGUIやnotarytoolへ移行するように発表しています。詳細は以下から。

## 参考
- 公式ドキュメント
    - [Customizing the notarization workflow](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow)
- [Apple、App Store外で公開するMacアプリのマルウェアチェックを行う公証サービスをより速くシンプルに行える「notarytool」コマンドを提供。](https://applech2.com/archives/20210611-apple-provide-notarytool-command.html)
- コマンドの概要と使い方の参考に。
    - [新しいApple公証用ツールのnotarytoolを使ってみた](https://qiita.com/spc_gmorimoto/items/6b31d82ab28202eff603)
    - [Xcode13で新しくシンプルになったmacOSアプリの公証\(Notarization\)を行う](https://qiita.com/hibara/items/672d386caf5d14346d68)
- WWDCの情報
    - [WWDC 2022](https://github.com/pommdau/swift-studying/blob/ab0d2857d9c96d0e2b0c9194817690e7f71ae9cc/wwdc2022/What%E2%80%99s%20new%20in%20notarization%20for%20Mac%20apps.md)
    - [WWDC 2021](https://github.com/pommdau/swift-studying/blob/ab0d2857d9c96d0e2b0c9194817690e7f71ae9cc/wwdc2021/Faster%20and%20simpler%20notarization%20for%20Mac%20apps.md)
- 過去の記事は`altool`を使っていますが`notarytool`に置き換える必要がありますね。
    - [後付けのApple Notarization Service（Appleの公証）対応を、シェルスクリプトでまとめて行ってみました](https://qiita.com/IKEH/items/6414c058396e11aaeb64)
    - [Command Line ToolのApple公証を行う](https://qiita.com/IKEH/items/5d093644922991079ee2)

## 手順

### キーチェーンへ情報の登録
- アプリパスワード以外に、AppleIDやTeamIDをまとめてキーチェーンに登録できる。
- `store-credentials`で指定した文字列を、公証の際に使用する。
- その他の情報が何を指すのか分からない場合は、[Xcode13で新しくシンプルになったmacOSアプリの公証\(Notarization\)を行う](https://qiita.com/hibara/items/672d386caf5d14346d68)が参考になる。

```sh
xcrun notarytool store-credentials "AC_PASSWORD" \
               --apple-id "xxx@gmail.com" \
               --team-id "<team_id>" \
               --password "xxxx-xxxx-xxxx-xxxx"
```

### 公証対象のzip化
- dittoにより、フルパスを指定しても変にフォルダ構造を保ったままzip化されないみたい。
- [【Bash】「ditto」 \- ディレクトリをバックアップする](https://renoji.com/IT.php?Contents=ShellScript_Bash/Cmd_ditto.html)

>-c	指定したパスに書庫ファイルを作成する。
>-k	ZIPで圧縮する。

```sh
# Create a ZIP archive suitable for notarization.
/usr/bin/ditto -c -k --keepParent "$APP_PATH" "$ZIP_PATH"

/usr/bin/ditto -c -k --keepParent /Users/hogeuser/Downloads/tmp/MyApp.app /Users/hogeuser/Downloads/tmp/MyApp.app.zip
```

### 公証

```sh
xcrun notarytool submit MyApp.app.zip \
                   --keychain-profile "AC_PASSWORD" \
                   --wait
Conducting pre-submission checks for MyApp.app.zip and initiating connection to the Apple notary service...
Submission ID received
  id: f2c5affb-5614-44a7-8050-de80287552e1
Successfully uploaded file
  id: f2c5affb-5614-44a7-8050-de80287552e1
  path: /Users/hogeuser/Downloads/tmp/MyApp.app.zip
Waiting for processing to complete.
Current status: Accepted........
Processing complete
  id: f2c5affb-5614-44a7-8050-de80287552e1
  status: Accepted
```

### 公証結果のログの確認

```sh
xcrun notarytool log f2c5affb-5614-44a7-8050-de80287552e1 --keychain-profile "AC_PASSWORD" developer_log.json
Successfully downloaded submission log
  id: f2c5affb-5614-44a7-8050-de80287552e1
  location: /Users/hogeuser/Downloads/tmp/developer_log.json

open developer_log.json 
```

- 下記の通りワーニングがある可能性があるため、成功してもログを確認することが推奨されている。

>[Customizing the notarization workflow](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow)
>Always check the log file, even if notarization succeeds, because it might contain warnings that you can fix prior to your next submission.

### Staple処理
- オフラインのときのためのもの。（ここは従来通り。）
- ついでに公証処理がうまくいっていることが確認できる（公証がダメだった場合にエラーとなるため）

```sh
xcrun stapler staple MyApp.app
Processing: /Users/hogeuser/Downloads/tmp/MyApp.app
Processing: /Users/hogeuser/Downloads/tmp/MyApp.app
The staple and validate action worked!
```

## Keychainの情報を使わない場合

```sh
# 公証のためのアップロード
xcrun notarytool submit <path-to-dmg> \
  --apple-id <your-apple-id> \
  --password <your-password> \
  --team-id <your-team-id> \
  --wait
  
# Staple
xcrun stapler staple <path-to-dmg>  

# ログの確認
xcrun notarytool log <your-log-number> \
--apple-id "your-id" \
--password "your-password" \
--team-id "your-team-id"
```