App Store Connect で、アプリ内課金商品の審査

App Store でアプリを配信するには、Appleによる事前審査が必要だというのは常識的に知られていることだと思います。
でも実は、アプリ内課金でなんらかの商品(アイテム)を売る時には、アプリとは別に、商品の審査も必要なのです。
この手順を日本語で書いてある資料が少なくて苦労したので、ここで情報共有しておきます。

### 動作確認環境

- Xcode : 11.4.1
- App Store Connect : 2020年6月13日時点

App Store Connect を使うには、Apple Developer 登録が必要です。
また、課金された収入を受け取るには、口座登録など面倒な手続きが必要です。

### 状況

アプリ内でシナリオを読む、いわゆるアドベンチャーゲームにて、「前編は無料、後編を読むには課金が必要」としていました（課金は1回のみ）。
これは「非消費型」のApp内課金で、[Appleのサポートサイト](https://support.apple.com/ja-jp/HT202023)での例でも書かれている「ゲームの完全版のロック解除」を売るのと同じです。
アプリそのものを有料にしてしまうとアプリ内容が分からないうちにお金を支払うことになってしまい、それはユーザーにとっては敷居が高くなります。
なので最近は「アプリそのものは無料で開始」できるようにしておき、別途、アプリ中でなんらかの課金をするのが普通です。こういうのを「アプリ内課金」と呼びます。

iOSの場合、このアプリ内課金は「App Store Connect」サイトにて、「機能」タブの「App内課金」で登録します。
私の場合は、「後編の購読権」を1つだけ登録しました。
（余談ですが、Google PlayでのApp内課金のIDとApp Store Connectの製品ID名を統一しておくには、製品IDを全て小文字にし、「-」を使わないことなどがコツになります。また、バンドルIDを頭に付けて世界的にユニークな値にしておく必要があります。製品IDの変更があると多数の箇所の変更が必要になるので、手抜きせずに設定しましょう）
![in_app_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181201/90132b7a-f095-af5b-a2d4-fbd18cfa770c.png)

「App内課金」ページの上部には、「一番最初のApp内課金は、Appの新しいバージョンと一緒に提出する必要があります。（〜略〜）バイナリをアップロードして初回のApp内課金を審査に提出後、（〜略〜）」のように書かれています。
が、全ての設定項目を全て入力しても、「後編の購読権」のステータスは「アップロード待ち」となり、黄色いアラート印が消えません。
内容を編集して保存する事はできますが、「初回のApp内課金を審査に提出」するためのボタンがどこにも見当たらないのです。

### 勘違いしていた事

App内課金の「アップロード待ち」は、アプリそのもの審査が通る事だと思っていました。
が、アプリの審査ではリジェクトされてしまいました。

```
Guideline 2.1 - Performance - App Completeness

We are unable to complete the review of your app because one or more of your in-app purchase products have not been submitted for review.

意訳：アプリ内課金商品の1つ以上が審査に提出されていないため、アプリの審査を完了できません。
```

確かに、アプリ内課金商品は審査に出していない。というか、審査に出せていないです。
このようなリジェクト案内が来るのであれば、何かを設定すればアプリ内課金商品を審査に出せるようになるということは分かります。
その方法がどこにあるのか、なかなか見つけられずにいました。

### 解決方法

結論：
アプリ内課金商品は、Xcodeを使ってプロジェクトとして作成し、アプリと同様に Archive でアップロードする。

このことの日本語記事がほとんど無く、気付くのにすごく時間がかかりました。
[このページ](http://tworks.hatenablog.jp/entry/2014/01/03/203000)に解説がありますが、説明が少し古いので、ここで説明します。

- Xcodeを起動し、「File」-「New」-「Project...」を選ぶ。
「Other」タブの「In-App Purchase Content」を選んで「Next」

- 「Prodoct Name」に、アプリ内課金商品名と分かる名前を登録（英語）
Apple Developerに登録してあれば、「Team」とかは選択肢に出てくるはず。

- TARGETS の General 「Product ID」で、App Store Connect の「App 内課金」で設定した「製品ID」を登録。
ContentInfo.plist の「IAPProductIrentifier」にも同じ製品IDが登録されるはず。

- 「Product」-「Archive」で、アプリと同じように「Distribute App」する。

- アップロードが終わり、数十分経過すると、App Store Connect ページのApp一般情報にて（それまでは見たことが無かった）「App内課金」の設定項目が現れ、App内課金を追加できるようになります。
「+」ボタンを押すと、Xcodeで作ったプロジェクトが選択可能になっています。
![ippan_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181201/cb840bf6-017a-6752-83ba-42b647ebaabb.png)

- 保存のあと、アプリを審査に出す事で、「機能」-「App内課金」のステータスも「審査中」になる。
その後、審査が通れば「承認済み」になる。

### どこを勘違いしていたのか

「機能」-「App内課金」で表示されているメッセージ「バイナリをアップロードして初回のApp内課金を審査に提出」の「バイナリ」は、Xcodeで作る必要があるというのが分からなかった。
売る商品は「ゲームのロック解除機能」なので、これがバイナリだという想像は付きにくかったです（これはおそらく、iTunesで音楽(バイナリ)を売る機能を流用したものだと思わます）。
Xcodeでアプリを作ったことのある人には当然の流れだったのかもしれませんが、私はUnityから間接的に使ったので気付きにくかったです。

### 余談

上述のとおり私は開発に Unity を使っているのですが、iOS アプリを Xcode からアップロード(Product - Archive - Distribute App)する前に、念のために In-App Purchase を追加しています。これは以下のように作業します。

- TARGETS - MermaidDays - Signing & Capabilities の「+ Capability」をクリック。
- In-App Purchase をダブルクリックして追加（この、ダブルクリックというのも分かりにくい…）。

Unity 側で内課金のプログラムコードは書いているので Xcodeで追加する必要は無さそうに思いますが、どうも In-App Purchase を追加する時に何か別の処理もしているみたいです。ので、念のために入れています。
たぶん、In-App Purchase を追加しなくても設定をいじれば問題無いと思うのですが、Unity から新しいビルドを作る度に複数箇所をいじるのが面倒なのでこうしています。
（しかしもしかしたら、その設定もする必要が無いのかもしれません）

### 最後に(宣伝)

私が試したのは非消費型コンテンツだけですが、おそらく消費型も、同じようにXcodeからプロジェクトを作ってアップしているのだと想像します。
プロジェクト数が多くなると大変なので、ゲーム内アイテムを直接売るのではなく、ゲーム内通貨を買わせて、その通貨でアイテムを買わせているようにしているのですね。
（勘違いしているようでしたらご指摘ください）

この記事が少しでも役に立ったという方は、[人魚Days](https://mermaiddays.com)アプリをダウンロードだけでもして頂けると励みになります。