SteamにmacOSアプリをリリースする方法

**Steamに(macOSアプリを公証して)ゲームをアップロードするときの手順です。**

色々みても手こずってしまったため、コピペできるテンプレートを公開します。

WindowsはGUIアプリがあるので大丈夫だと思いますが、7以降のコマンドをウインドウズ仕様に変えれば通ります。

***ちなみにmacOS向けのゲームを出すには15000円ぐらい払ってアップルにデベロッパー登録して、公証を通さないと開く際に一手間作業が必要になり、steamではリリースがめんどくさくなります。（毎回設定に未公証のアプリを実行するというボタンを押しに行く必要があり、Steamでも公証していないことを公開しないといけません。）***


## 1. AppleにDeveloper登録を行い証明書を発行しキーチェーンに登録後、app用パスワードを取得する
以下のどちらかを見て、キーチェーンへの登録とアプリ用パスワードの取得を行ってください。
この作業は一回限りです。

このページの作業を一通り

https://www.create-forever.games/unitymac-notarization-1-2023/

もしくは、こっちのページでは、有効な Developer ID でコード署名するの作業後、キーチェーンに登録します。そのあとアプリ固有のパスワード作成画面という部分の作業でapp用のパスを取得します。

https://qiita.com/sprout2000/items/0fa5db89c43155f4f0c8



## 2.ビルドする
私はUnityで開発したアプリですが、どんなプラットフォームでも同じはずです。
Xcode用のパッケージではなく、appファイルとしてビルドしてください。
その際どこかにビルドやリリース作業用のフォルダを作成し、毎回同じ場所にビルドすることをお勧めします

*Users/ユーザー名/Documents/アプリの名前/* や *Users/ユーザー名/Documents/アプリの名前/raw/* など

## 3.アプリにEntitlementを付与する
以下のファイルをコピペしてどこかに保存してください。アプリに権限を付与します。
以下の設定ではネットワーク通信とVCの設定をしているのですが、不要であれば消してください。他の機能も使っており、追加の権限が必要そうな場合はChatGPTにコードをコピペして自分のゲームに必要な権限を教えてくれというと教えてくれると思います。

```ゲーム名.entitlement
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
	<key>com.apple.security.app-sandbox</key>
	<true/>
    <key>com.apple.security.files.user-selected.read-only</key>
    <true/>
	<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
	<true/>
    <key>com.apple.security.device.audio-input</key> //VC
    <true/>
    <key>com.apple.security.device.microphone</key> //VC
    <true/>
    <key>com.apple.security.network.client</key> //ネット
    <true/>
    <key>com.apple.security.network.server</key> //ネット
    <true/>
</dict>
</plist>
```

以下のコマンドをターミナルに記述してください。先ほど作成したエンタイトルメントをアプリと結びつけます。
パスやIDなどは自分の環境に合わせて変更してください。
```shell 
chmod -R a+xr "Users/ユーザー名/Documents/アプリの名前/raw/アプリの名前.app"
```
名前やIDはApple Developerで確認してください
```shell 
codesign -o runtime -f --deep -s "Developer ID Application: 名前や法人名 (開発者のTeamID大文字英数のやつ)" --entitlements "entitlementsまでのパス/アプリの名前.entitlements" "Users/ユーザー名/Documents/アプリの名前/raw/アプリの名前.app"
```

## 4.キーストアにIDとパスワードを登録しておく
この作業も一回限りです。公証の時に1で設定したキーチェーンの情報をIDパスワードの入力なしでKeyStoreから呼び出せるように登録しておきます。今後この情報は--keychain-profile "Notarization"だけで使えるようになります。
```shell
xcrun notarytool store-credentials --apple-id "APPLEIDに指定したメールアドレス" --team-id "開発者のTeamID"
```
## 5. ビルドしたアプリのZip化
公証に出すためにはZip化する必要があります。公証後、解凍し、Steamにアップロードするので混ざってわかりにくそうだと思ったらZIPするフォルダを別にしてください。
```shell
zip -r /Users/ユーザー名/Documents/アプリの名前/normalized/アプリの名前.zip /Users/ユーザー名/Documents/アプリの名前/raw/アプリの名前.app
```

## 6. 公証に提出
3でつけた権限の種類にもよりますが、ネットワークの権限などをつけると初回は半日ぐらいかかる印象です。
2回目からは数秒で終わります。
```shell
xcrun notarytool submit "/Users/ユーザー名/Documents/アプリ名/normalized/アプリ名.zip" --keychain-profile "Notarization" --wait
```

もし、後日公証されたか確認したい場合は、historyコマンドを打った後、調べたいIDでlogを表示すると公証が通ったか確認できます。
```shell
xcrun notarytool history --keychain-profile "Notarization"
```
```shell
xcrun notarytool log 調べたいid --keychain-profile "Notarization"
```

## 7. Steamのvdfファイルを用意する
ここからがSteamへの提出作業になります。
以下がvdfファイルになります。Valve data fileなどの略だと思いますが、アップロードするファイルのパスやその構成などを指定します。以下のファイルをコピペし、ID２箇所を変えて.vdfで保存してください。保存場所はどこでも大丈夫ですが、公式では ***/Users/steam sdkまでのパス/tools/ContentBuilder/scripts/*** 以下に配置しています。

DepotsはDepotファイルへのパスを記述して別のファイルに書くこともできますが、私の環境では別のDepotファイルへのアクセスがうまくできなかったので同一ファイルに直接記述しています。
**これはAppをそのまま上げる設定です**。アセットバンドルを利用していますが、毎回フルでアップロードしています。
ファイル名は公式にならってapp_build_としていますが、なんでも大丈夫です。デモや体験版があるなら別に作っておくといいです。

```app_build_main.vdf
"AppBuild"
{
	"AppID" "SteamのアプリID。たいてい0で終わる" // Your AppID //変更
	"Desc" "アップロード時にメモしておきたい説明" // internal description for this build //変更

	"Preview" "0" // make this a preview build only, nothing is uploaded
	"SetLive" "" // set this build live on a beta branch

	"ContentRoot" "/Users/ユーザー名/Documents/アプリ名/normalized/などの公証したアプリがあるファイルへのパス" // content root folder relative to this script file　//変更
	"BuildOutput" "../output/" // put build cache and log files on different drive for better performance
	"Depots"
	{
		"デポID。だいたいアプリIDの末尾が1や2になったもの" //変更
		{  
			"FileExclusion" ".DS_Store"　//アップロードしたくないものを記述していく。
			"FileMapping"
			{
				"LocalPath" "*"
				"DepotPath" "."
				"recursive" "1"
			}
		}
	}
}
```

もし、アセットバンドルの差分だけ更新したいのであれば以下のようにContentRootを追加してアセットバンドルのパスを指定すれば差分だけアップロードできるはずです。
```app_build_main.vdfの一部
"Depots"
{
    "デポID。だいたいアプリIDの末尾が1や2になったもの"
    {  
        "ContentRoot" "アセットバンドルのフォルダへのパス"
        "FileExclusion" ".DS_Store"
        "FileMapping"
        {
            "LocalPath" "*"
            "DepotPath" "."
            "recursive" "1"
        }
    }
}
```


### 8. Steamへのアップロード
最後は提出です。まずは公証されたzipを解凍します。
```shell
unzip /Users/ユーザー名/Documents/アプリ名/normalized/アプリ名.zip -d /Users/ユーザー名/Documents/アプリ名/normalized/
```

/builder_osx/steamcmd.shのあるコンテンツビルダーまでのパス、IDやパスワードやVDFへのパスなどを変更して以下のコマンドをターミナルにコピペしてください。場合によってはSteamの二重認証などを経て、アップロードが始まります。

```shell
cd /Users/steam sdkまでのパス/tools/ContentBuilder
./builder_osx/steamcmd.sh +login スチームのID スチームのログインパスワード +run_app_build_http /Users/steam sdkまでのパス/tools/ContentBuilder/scripts/vdfファイルの名前.vdfなどのvdfまでのパス
```


## 参考
https://partner.steamgames.com/doc/sdk/uploading?l=japanese


https://tsukinowa.hatenablog.jp/entry/2018/07/31/235304


https://kan-kikuchi.hatenablog.com/entry/Steam_Upload_Mac