【Oculus Quest】AppLabでコンテンツをリリースする手順

AppLabの登場により、Oculusでの配信のハードルが下がったということで、力試しのつもりで申請してみました。

https://www.oculus.com/experiences/quest/4070195013101095/

ここでは、AppLabにアプリを申請する手順とポイントをまとめたいと思います。（通常のAPKファイル作成については、詳細触れていませんのでご了承ください）
申請にあたっては、下記の記事を参考にさせていただきました。（いつもお世話になっています！）

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

https://framesynthesis.jp/tech/unity/oculusquest/#app-lab


また、公式ガイドラインは一度目を通しておくべきかと思いますが、その中でも個人的に参考になったページを下記にピックアップしました。
##Oculus公式ガイドライン
+ [Questバーチャルリアリティチェック(VRC)ガイドライン](https://developer.oculus.com/distribute/publish-quest-req/)
+ [リリースビルドのためのアプリマニフェスト](https://developer.oculus.com/distribute/publish-mobile-manifest/)（※1）
+ [Androidアプリケーションの署名](https://developer.oculus.com/distribute/publish-mobile-app-signing/)（※2）
+ [Oculusストアアセットデザインガイドライン](https://developer.oculus.com/distribute/asset-guidelines/)（※3）

##目次　〜大まかな流れ〜
<dl>

  <dt><H4>APKファイルの作成</H4></dt>
  <dd>1. ビルド設定で押さえるポイント</dd>
  <dd>2. Bundle Version Code の設定</dd>
  <dd>3. 不要なマイク使用権限を削除する</dd>
  <dd>4. Androidアプリの署名（Keystore作成）</dd>
  <dd>5. AndroidManifestの作成</dd>
  <dd>6. App ID の設定</dd>

  <dt><H4>申請</H4></dt>
  <dd>① ビルド</dd>
  <dd>② 説明</dd>
  <dd>③ スペック</dd>
  <dd>④ 追加情報</dd>
  <dd>⑤ アセット</dd>
  <dd>⑥ コンテンツ評価</dd>
  <dd>⑦ 価格</dd>

  <dt><H4>リジェクトの対応（修正）</H4></dt>
  <dd>1. 修正項目の修正</dd>
  <dd>2. 再ビルド</dd>

  <dt><H4><i>（リリース）</i></H4></dt>

  <dt><H4>アプリのプロモーション（任意）</H4></dt>
  <dd>1. Oculusキーの発行</dd>

</dl>

##APKファイルの作成
まずはAPKファイルの作成です。
申請するためのAPKファイルでは、非公開のAPKファイル作成時にはしなくてよい作業も必要になります（ビルド時の設定のほかアプリの署名やマニフェストの作成など）。実際にやってみて、いつもの手順（非公開のAPKファイル作成時）以外で必要な作業やポイントを書いておきたいと思います。

###1. ビルド設定で押さえるポイント
下記は必須です。まぁ、だいたいこの設定でビルドしているかな、と思いますが。。

+ IL2CPP
+ Minimum API Level：23以上
+ Install Location (インストール場所)：Automatic (自動)

（※1）[リリースビルドのためのアプリマニフェスト](https://developer.oculus.com/distribute/publish-mobile-manifest/) 参考。
![ビルド設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/0a562b4e-088e-c5ad-e5ba-8985058d9aa4.png)

###2. Bundle Version Code の設定
このまんまなので、フレームシンセシス様の引用で恐れ入ります。。

> Oculus のダッシュボードは
> Project Settings の Player > Other Settings > Bundle Version Code
> の数値でアプリのバージョンを識別しています。新しいバージョンの apk ファイルをアップロードするたびに Bundle Version Code の数値を増やしてビルドする必要があります。
> （[Unity + Oculus Quest 2 開発メモ](https://framesynthesis.jp/tech/unity/oculusquest/#app-lab)より）

（※1）[リリースビルドのためのアプリマニフェスト](https://developer.oculus.com/distribute/publish-mobile-manifest/) 参考。

なので最初は、
`Version`：0.1
`Bundle Version Code`：1
などでOK。申請する際にAPKファイルを再アップする時は、`Bundle Version Code`：2,3,...といった具合に数値を上げます。
![ビルド設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/181790fd-759a-2184-1a2a-db85d25b9811.png)

【参考】
`Version`：ストアなどユーザーが見られるリリースバージョン
`Bundle Version Code`：ビルドの区別をするためのバージョン(ビルド番号)
※アプリのバージョニングについては、下記が分かりやすく解説されています。
https://developer.android.com/studio/publish/versioning
https://qiita.com/nkjzm/items/492cfc1103b8a124770a

###3. 不要なマイク使用権限を削除する

「マイクを使用しないアプリなのに権限があるとリジェクトされる」とのことなので、マイクを使用しない場合は注意が必要です。
こちらも、フレームシンセシス様の記事を引用させていただきます。

> 対処方法としては、もし Oculus/LipSync フォルダと Oculus/Avatar フォルダの機能を使用していなければこれらを削除するのが簡単です。
> （[Unity + Oculus Quest 2 開発メモ](https://framesynthesis.jp/tech/unity/oculusquest/#app-lab)より）

###4. Androidアプリの署名（Keystore作成）
またまた、フレームシンセシス様の引用ですみません。。

> apk ファイルをビルドする際に署名が必要です。
> Project Settings の Player > Publishing Settings > Keystore Manager… 
> で署名ファイル（*.keystore）を作成して署名します。アプリのアップデートの際は同じ署名ファイルで署名する必要があります。設定したパスワードを忘れないように注意してください。プロジェクトファイルには保存されません。
> （[Unity + Oculus Quest 2 開発メモ](https://framesynthesis.jp/tech/unity/oculusquest/#app-lab)より）

（※2）[Androidアプリケーションの署名](https://developer.oculus.com/distribute/publish-mobile-app-signing/) 参考。
![Keystore作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/8f2a2c26-f644-0519-88ca-20c45f040a3b.png)
![Keystore作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/93d5500b-323d-9bff-ff01-b4c535e23e28.png)

###5. AndroidManifestの作成

Oculus > Tools > Create store…
を実行するだけです。
Assets\Plugins\Android　の中に、AndroidManifest.xmlが作成されます。

（※1）[リリースビルドのためのアプリマニフェスト](https://developer.oculus.com/distribute/publish-mobile-manifest/) 参考。
![AndroidManifestの作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/bbbb13d2-9f5a-5a55-a97b-f6fc0073f685.png)
生成されたファイルを開くとこんな感じに記載されています。
![AndroidManifestの作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/e018d4ee-7019-7dbc-a5aa-7f556152686b.png)
###6. App ID の設定
最後まで、引用させていただきすみません。（ありがとうございます）

> apk ファイルをビルドする際に App ID を設定する必要があります。
> Oculus のダッシュボードでアプリを作成して Getting Started API のページを開き、取得した App ID を
> Oculus > Platform > Edit Settings の Application ID
> のところに設定します。
> （[Unity + Oculus Quest 2 開発メモ](https://framesynthesis.jp/tech/unity/oculusquest/#app-lab)より）

![AppIDの設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/90a1d12a-8cb1-569d-193b-3975b08e0389.png)
![AppIDの設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/484db437-98c6-3eba-06b3-b80cb6482e1c.png)

##申請
いよいよアプリの申請です。

1. 「Oculus開発センター」のダッシュボードにアクセスします。
https://developer.oculus.com/manage/

2. 「新しいアプリを作成」をクリック
![新しいアプリを作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/9626f6b0-c176-f5bf-d525-22b253b47dd2.png)

3. アプリ名：（任意で入力）
3. プラットホーム：Quest(App Lab)を選択
4. 「作成」をクリック（アプリのページができます）
![新しいアプリを作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/5d4676c1-9324-d82f-066d-e32d60a41400.png)

6. 右上の「申請の詳細に移動」をクリックすると、下図のような画面になると思います。（こちらは申請済みアプリの画面ため全て「済み」になっていますが、最初はチェックが入っていない状態です）

7. 「申請を開始」をクリックすると、左列の上から各項目順に、申請内容が表示されます。

![アプリの申請1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/123adc34-cb8b-49db-eb38-d7ebd75418ab.png)


###①ビルド
右上の「新しいビルドをアップロード」から、作成したAPKファイルをアップロードします。（ブラウザからアップロード出来るのは400MBまでのようです）
![アプリの申請2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/8f284881-49dd-4f0b-b59b-86200b93bce7.png)
APKファイルが正しく作成されていないと（アプリの署名やマニフェストなど含め）、ここでエラーが出ます。逆に、アップロードできなければ、そのAPKファイルは申請要件を満たしていないということが分かるので、確認にもなります。

無事アップロードに成功したら、以降ではリリースするのに必要な各種設定を行なっていきます。

:::note info
「保存して続行」で次の項目へいけます。
左列の項目を選べば、順番通りでなくてもOK。
「下書きを保存」で、ダッシュボード内に保存されるので、申請途中で中断しても大丈夫です。
:::
###②説明
アプリ名や説明を入力していきます。

+ アプリ名
+ 簡単な説明
+ 詳細

:::note info
言語はデフォルトでは英語だけですが、「言語を管理」から新たに言語追加出来ます。
:::
###③スペック
ゲームモードや対応言語などを設定していきます。（「ジャンル」は３つ設定可能）

###④追加情報
開発者情報や連絡先等を設定していきます。

:::note warn
ウェブサイトやプライバシーポリシーへのリンクが必要なので、無い場合は要作成。
:::

###⑤アセット
ロゴやスクショ、PVなどを設定していきます。

:::note info
予告編動画以外は必須のようです。
:::

◆ロゴとアイコン

+ ロゴ（1440x1440）
+ アイコン（512x512）

:::note warn
ロゴは、「アスペクト比: 変数、9000 x 1440px (最大) (32-Bit PNG 透過)」と書かれており、英語の説明を読むと、アスペクト比は特に指定なしでサイズは最大9000 x 1440pxの32ビット透過PNGと読めるのですが、手持ちのPNGをいろいろ入れてみても「使用できない画像サイズです」というそっけないエラーで拒否されます。結局 1440x1440 の透過PNGだけがうまく行きました。
:::

◆カバーアート

+ 横型（2560x1440）
+ 正方形（1440x1440）
+ 縦型（1008x1440）
+ ミニ横型（1008x360）

◆PDPアート

+ ヒーローカバー（3000x900）

◆スクリーンショット

+ 画像５点（2560x1440）

◆予告編（※任意。無くてもOK。）

+ 動画（アスペクト比: 16:91280 x 720px (最小サイズ) (H.264とAAC音声によるMPEG-4コンテナ)）
+ カバー画像（2560x1440）


（※3）[Oculusストアアセットデザインガイドライン](https://developer.oculus.com/distribute/asset-guidelines/) 参考。

###⑥コンテンツ評価
IARC証明書を用いてアプリの対象年齢を設定していきます。
ちなみに、IARC証明書は質問に答えるだけですぐに、しかも無料で作成出来ます。
IARC証明書を作成する場合は「新しい証明書をリクエスト」を押します。
既存の証明書を使用するには、証明書IDを入力すれば良いようです。

###⑦価格
アプリの価格を設定していきます。(無料にも出来ます)
ちなみに、リリース後の変更はメールでやらないといけないようです。

> submissions@oculus.comにメールを送信することで価格の変更を手動でリクエストできます。

***
全ての入力が完了し、チェックマークが付いたら送信の「ストアに送信」から申請します。
「アプリを申請していただきありがとうございます」という件名で、本文なしのメールが届きます。


##リジェクトの対応（修正）
審査結果はメールで通知されます。
私の場合は、申請から25日目に以下の件名のリジェクトメールが届きました。

###1. 修正項目の修正
> 件名：「HALLO EINSTEIN」への変更リクエスト
![リジェクトメール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/8006107e-2ee1-4f3c-2905-874ce43fc701.png)

メール本文の「here」から審査結果にアクセスし、内容を確認します。
私の場合、以下のような修正を求められました。

+ 60fpsを大幅に切っているところがある
+ UIのボタンを押しても効かないときがある

（もう一点あった気がしますが忘れました...が、すべて基本的なことでした...orz）
ちなみに、どの場面で、など結構詳しく書いてくれているので、該当箇所を見つけるのに苦労はしないと思います。


###2. 再ビルド
修正が終わったら、再度ビルドしてAPKファイルを作成します。このとき、Bundle Version Codeの数値を上げてビルドしてください。
`Bundle Version Code`：（前回が1なら、2に上げる）
※APKファイルの作成 / 2. Bundle Version Code の設定 を参照。

修正ファイルが作成できたら、再び「アプリの申請」の一番目の項目「ビルド」に行き、「新しいビルドをアップロード」から、修正したAPKファイルをアップロードします。
※申請 / ①ビルド を参照。

他の項目は設定済なので、最後の「送信」から、再度「ストアに送信」します。


##アプリのプロモーション（任意）
無事に審査を通過してリリースされると、Oculusの公式ストアから検索できるようになります。（AppLabでリリースされた作品は、完全一致でないと検索に出てこないので注意）
![AppLab検索.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/cf778529-0fa4-8906-fe07-f81386ad037f.jpeg)

リリース後のプロモーションについては、いろいろな方法があると思いますし自由ですが、「Oculusキーの発行」について、ハマった箇所があったので記載しておきたいと思います。

###1. Oculusキーの発行
「Oculusキー」とは、開発者側で作成して自由に配布できる、ダウンロードコードのことです。公式サイトでは、下記のように説明されています。

https://developer.oculus.com/policy/distribution-options/#oculus-keys

> Oculusキーは、アプリ承認後、必要に応じて生成できる25文字の英数字コードです。Oculusキーの発行権を得てキーを発行し配布すると、キーを受け取った人はOculusアプリで[コードを利用]セクションにキーを入力することにより、アプリまたはアプリ内購入アイテムをダウンロードできます。キーは、販売、贈呈のほか、印刷してオフラインで配布するなど、開発者の都合に合わせて配布することができます。キーはメディアにレビュー用の見本を渡す場合などにも便利です。

こちらのページで作成方法も記載されているのですが、作成ボタン（①）から開いたウィンドウで必要項目を記入するところまでは問題ないと思います。
![Oculusキー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280548/58697381-3108-c170-45b6-f152f11d08ca.jpeg)
その後、下記のように説明されているのですが、

> 6.完了したら[送信]をクリックします。250以下のキーを作成した場合は、キーのリストが表示されます。各キーのフォーマットは5x5です(例: 3YEBU-GCRKT-SHHHH-PYE0T-KVW7S)。

> 7.このページを閉じるとキーを取得できなくなるため、キーをコピーして安全な場所に保存します。

[送信]ボタンがないので作成ボタン（②）を押すと、「キャンペーン名」がリストアップはされるものの、「キーのリスト」は表示されません。。あたかもこのページにキーが表示されるような書き方なのですが、実はコードが記載されたテキストファイルが自動でダウンロードされるようです。（ダウンロードフォルダを確認してみてください。）
これに気づくまでにかなりの時間を要したので、参考になれば幸いです。