Expoで作成したアプリをApp Storeに申請するまで（2019/11時点）

Expoで最低限のアプリを試作し、App Storeに申請してみたものが承認されたので、2019年11月時点での承認までの流れをまとめておきます。

大まかな流れは以下のような感じです。

 1. Apple Developer Programに登録
 2. アイコンやスプラッシュスクリーンを作成
 3. iOS用にビルド、ダウンロード
 3. App Store Connectで新規Appを登録
 4. アプリ（ipaファイル）をApp Store Connectにアップロード
 5. App Store Connectで必要なアプリ情報やスクリーンショットなどを入力
 6. 申請

1はすでにしている方にとっては不要です。申請には時間がかかるので、登録していない場合は早めにしておいたほうがよさそうです。

# Apple Developer Programに登録

https://developer.apple.com/jp/programs/

ExpoでiOS向けにビルドする時点でApple Developer Programに登録（$99/年）している必要があります。
個人として登録する場合には2ファクタ認証を有効にしたApple IDがあればOK。この場合App Store上で開発者として氏名が公表されます。
組織として登録する場合は法人である必要などいくつか制限があります。詳しくは[こちら](https://developer.apple.com/jp/programs/enroll/)。

「登録」から氏名住所などの情報入力→クレジットカードの登録・決済と画面の流れに沿って完了してください。

申請の状況は[Apple Developerのアカウント画面](https://developer.apple.com/account/)で確認できます。
決済後はしばらくこの状態になります。
<img width="1680" alt="oHrPK.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514229/6fc6ff45-2de5-fe80-14de-785f9fb53a52.png">

48時間まではかかると書いてありますが、私の場合は10月28日18時ごろに申請し、4日弱かかりました。
Appleから『Welcome to the Apple Developer Program.』というメールが届いたら登録完了です。

# アイコンやスプラッシュスクリーン画像を作成

アプリアイコンと、アプリ起動時に表示されるスプラッシュスクリーンを用意します。
推奨はアルファ無しのpngファイルでサイズは

 * アイコン→ 1024px × 1024px
 * スプラッシュスクリーン→ 横1242px × 縦2436px

Expoプロジェクトを作成した時点で`/assets`ディレクトリにダミーの画像が入っているので、それを上書きします。
ディレクトリ構成やファイル名を変えた場合は`app.json`の`icon`と`splash`で指定しているパスを変更してください。
`splash.resizeMode`はCSSの`background-size`と同様の挙動をします。大概はデフォルトの`container`にして`splash.backgroundColor`を指定することになると思います。

今回申請したアプリは文字列からQRコードを生成するだけの単純なものです。
イラレで適当に作り、アイコンはこんな感じにしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514229/e70443e6-e65e-8654-93ee-5a06fac4a5d0.png" width="320">

スプラッシュ画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514229/c2b11178-ba84-22b3-d278-f505487da0b8.png" width="320">

backgroundColorにスプラッシュ画像で使っている背景色を指定し、余白が見えないようにします。

```json:app.json（部分）
    "icon": "./assets/icon.png",
    "splash": {
      "image": "./assets/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#00a5ff"
    },
```

# iOS用にビルド（Apple Developer Programにメンバーシップ登録後）

ビルドの前に、公式ドキュメントにしたがって`app.json`に必要な情報を追加します。
https://docs.expo.io/versions/latest/distribution/building-standalone-apps/

iOSでデフォルトのものに加えて最低限必要なのは、`ios.bundleIdentifier`です。
保有しているドメイン名などを使い、アプリを識別する独自の（ユニークな）値を設定してください。

`app.json`での設定が終わったら、ExpoのコマンドラインツールでiOS向けにビルドを開始します

```bash
$ expo build:ios
```

初めてビルドする際はApple IDとパスワードの入力が求められるので、先ほどDeveloper Programに登録したApple IDで認証します。
途中いくつか質問されますが、基本的にそのままEnterし、Expoに任せてしまって問題ありませんでした。

無事にビルドが完了したら、URLが表示され、ipaファイルがダウンロードできるようになります。

```bash
✔ Build finished.
Successfully built standalone app: https://expo.io/artifacts/xxxxxxxxxxxxxx
```

# App Store Connectで新規Appを登録

[App Store Connect](https://appstoreconnect.apple.com/)からアプリの登録を行います。ブラウザはSafariが推奨されているようなのであえてChromeでやってみましたが、特に問題ありませんでした。

メニューの「マイ App」→「+ボタン」→「新規 App」でモーダルを開き、アプリ名などを入力します。
「バンドルID」には、先ほどビルドしたアプリの`bundleIdentifier`が選択肢の中に入っているはずなので、それを選んでください。「SKU」は開発者ごとにアプリを識別するための値です。好きなものを入れてください。
「作成」するとアプリが登録され、さらに情報を入力する画面に移ります。

このまま全ての情報を入力してもいいですが、この段階でipaファイルをアップロードすることが可能になるので、次へ進みます。

# アプリ（ipaファイル）をApp Store Connectにアップロード

以前はXcodeのApplication Loaderという機能を使っていたようですが、現在この機能はXcodeからなくなっているので、別のコマンドラインツールやアプリケーションを使ってApp Store Connectにアップロードします。

Transporter（公式の専用アプリケーション）
https://apps.apple.com/jp/app/transporter/id1450874784~~

Application Loader亡き後の私たちはどうやってipaをアップロードするのか
https://blog.nkzn.info/entry/2019/09/22/181836~~

**追記（2019/11/8）**
私はコマンドラインツールの方でアップロードしたので、専用アプリの方は確認していないのですが、アップロードの際に求められるパスワードは[App用パスワード](https://appleid.apple.com/account/manage)を使うようです。

~~ipaファイルをアップロード後、しばらくするとApp Store Connectからメールが届きました。~~

```
Dear Developer,
We identified one or more issues with a recent delivery for your app, "文字列からQRコード生成" 1.0.3 (1). Your delivery was successful, but you may wish to correct the following issues in your next delivery:

ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs . See https://developer.apple.com/documentation/uikit/uiwebview for more information.

After you’ve corrected the issues, you can use Xcode or Application Loader to upload a new binary to App Store Connect.

Best regards,

The App Store Team
```

~~どうやら内部で使用されているモジュールにDeprecatedなもの（UIWebView）が入っているため注意されているみたいです。
Expoのフォーラムを見ると、同じメールは他のExpo開発者にも送られておりAppleもそれを認識しているとのこと。
https://forums.expo.io/t/received-mail-from-apple-about-the-deprecated-api-uiwebview/27117~~

~~今のところ申請には影響がないみたいですが、将来的にExpoでビルドしたアプリがそのままではApp Storeに申請できないということになるかもしれません。
Expoのv35.0.0からUIWebViewへの依存を無くしていく方向で開発を進めていっているようなので、常にExpoのバージョンアップを意識しておきましょう。。。~~

**[2020/04/02追記]**
**SDK37からUIWebViewの使用が廃止され、上記のメールはなくなりました。**
https://dev.to/expo/expo-sdk-37-is-now-available-69g#uiwebview-removed

# App Store Connectで必要なアプリ情報やスクリーンショットなどを入力

再びApp Store Connectを開き、必要なアプリ情報を入力します。
入力しないと後から何か言われるとかはなく、申請を完了する際にバリデーションがかかるため、それに従って入力していけばOKです。各項目については今後変更される可能性もあるので、詳しい説明は割愛します。

左メニューの「App 情報」のほか、「IOS APP」のバージョンを選択すると、スクリーンショットやプロモーション用テキストなどを入力する画面になります。
スクリーンショットは最低でもiPhoneの6.5インチ、5.5インチ、iPad Pro12.9インチ（第３世代、第２世代）の4枚の登録が必要です。

スクリーンショットの仕様
https://help.apple.com/app-store-connect/#/devd274dd925

つまり

 * iPhone 6.5インチ → 1242 × 2688px
 * iPhone 5.8インチ → 1242 × 2208px
 * iPad → 2048 × 2732px

の３種類のサイズです。これ以外は自動リサイズで生成されます。

Expoでエミュレータを開き、スクリーンショットを撮ったあと、iPhoneのみプレビューなどで指定のサイズにリサイズします。iPadのものは第３世代と第２世代で同じ画像を使用して大丈夫でした。

その他、年齢制限のための質問に答えたり、コピーライト、連絡先情報を入力したりします。

個人で申請する場合に気になるのが「App 情報」の「プライバシーポリシーURL」だと思いますが現在は必須になっています。
今回申請するアプリは認証などは必要なく個人情報を保存することもないため、Github Pagesでごく簡単な静的ページを作り、そのURLを入れました。個人情報を扱っていない限りはこんな適当なものでも承認してくれます。思いのほか懐が深い。
https://mildsummer.github.io/privacy-policy/index.html

# 申請

情報を入力後、「申請」ボタンでバリデーションが通れば完了です。
この申請では一度もrejectされず承認されました。
タイムラインをまとめるとこのような感じです。

10/28（月）18:14　Apple Developer Program申請
11/1（金）15:39　Apple Developer Program登録完了
11/1（金）19:00　App Store Connectにipaアップロード
11/1（金）19:02　App Store Connectから「Deprecated API Usage」のお知らせ
11/1（金）19:20　App Store Connectからアップロード完了のお知らせ
11/1（金）19:49　App申請
11/2（土）5:58　App Store ConnectからIn Review（審査中）のお知らせ
11/2（土）7:09　App Store Connectからアプリ承認のお知らせ

## 公開されたアプリ

App StoreへのリンクはApp Store Connectの「App 情報」の「App Store で表示」で取得できます。
凡百のQRコードアプリたちの中に新たに加わってしまったのがこちらです。Appleさんごめんなさい。

文字列からQRコード生成
https://apps.apple.com/us/app/%E6%96%87%E5%AD%97%E5%88%97%E3%81%8B%E3%82%89qr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/id1485845667?l=ja&ls=1