独学でAppStoreにアプリを公開するまで

# はじめに

AppStoreにiOSアプリを公開するまでにやったこと・大変だったことを振り返りたいと思います。
これからiOSアプリ開発に挑戦したいと思っている方の参考になればと思います。

# 自己紹介

私は、実務未経験で独学でプログラミングを学習してます。
2020年の2月末から夏頃まではWebアプリ開発を学習していました。

作ったアプリの紹介記事↓
[独学半年の実務未経験がRails＋Nuxt.jsでSPA作ったので見て欲しい](https://qiita.com/nizi24/items/d12e9642b9774670a6ae)

秋頃は資格取ったりしてました。
10月末からiOSアプリ開発を学習し始めました。
12月末までに2つアプリをAppStoreに公開することができたので、アプリを紹介したいと思います。

# アプリ紹介

学習から開発、申請までを時系列で振り返える前に、アプリをシンプルに紹介しておきます。

### 一つ目

一つ目は「<strong>タグメモ</strong>」です。
タグをつけて管理できるシンプルなメモ帳アプリです。

[AppStore](https://apps.apple.com/us/app/%E3%82%BF%E3%82%B0%E3%83%A1%E3%83%A2/id1540566095?itsct=apps_box&itscg=30200)
[リポジトリ](https://github.com/nizi24/TagMemo)
<img width="400" alt="new_iphone12.001.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651979/635f7b59-5c48-53ba-1a42-472ad6a48463.jpeg">

11月7日から制作を始めて同月の17日にリリースしました。

### 二つ目

二つ目は「<strong>StudyLevel</strong>」です。
毎日の勉強時間を記録するとレベルが上がっていく学習習慣支援アプリです。

[AppStore](https://apps.apple.com/jp/app/id1546368607)
<img width="144" alt="Untitled.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651979/c7cf9746-2651-08e8-773f-25124d88e091.png">
<img width="400" alt="iphone12_keynote_StudyLevel.001.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651979/805a0f9d-5772-d9f9-3d15-6dec4a87af66.jpeg">


こちら、下記で紹介記事を書いているWebアプリのiOS版リメイクになります。
[独学半年の実務未経験がRails＋Nuxt.jsでSPA作ったので見て欲しい](https://qiita.com/nizi24/items/d12e9642b9774670a6ae)

11月17日から開発を始めて、12月29日にリリースしました。

# 時系列で振り返る

## まずは学習

[Twitter](https://twitter.com/nizi_24a)を振り返ってみると、10月20日から学習を始めたようです。

### 使用した主なリソース

- [Swift実践入門](https://gihyo.jp/book/2020/978-4-297-11213-4)

まずはSwiftの基本を学習したいと思い、最初の方に購入した書籍です。
よくある説明不足の初心者向け書籍とは異なり、基礎的な部分から詳しく説明されていました。
後半部では、「どういう場面で役に立つのか」といった実践的な内容まで解説されており、学んだのどこで使えばいいのかわからないということがありませんでした。
「Webサービスとの連携」の章もあり、APIとの通信を頻繁に行う「StudyLevel」の開発の際にはとても役に立ちました。

- [SwiftUI実践入門](https://www.sbcr.jp/product/4815604066)

紹介したアプリは二つともSwiftUIを使用して開発しました。
SwiftUIの基本的な考え方から、リファレンス的な内容まで詳しく説明されていました。
SwiftUIでUIKitの部品を使う方法まで載っており、SwiftUIでできないことをカバーする方法まで説明されています。
開発中にも何度も読み返しました。

### どのくらいインプットに時間をかけるか

私は学習を始めてから3週間弱でアプリの開発を始めました。( 一日平均5時間ぐらい )
振り返ってみると、少し時間をかけすぎてしまったように感じます。
やはり実際にコードを書かないと頭に残りませんし、基礎的なことすらアウトプットできていないのに実践的な知識を取り入れようとしても意味がないなと感じました。
最初はさらっと学習して、開発していく中で疑問に思ったことを再度学習するのが効率的だと思います。

## メモアプリを開発し始める

とりあえず簡単なアプリでいいのでAppStoreに公開してみたい！という意気込みで開発を始めました。
シンプルで機能が少ないものでもAppStoreに公開されており、これなら自分にも作れそうだ！という理由でメモアプリを作ることにしました。( しょうもない理由ですいません )

メモの保存には[Realm](https://realm.io)を使用しました。
開発を始めてから学習しましたが、高度なことしていないこともあり、特に困りませんでした。

開発は順調に進み、一週間ほどで完成させることができました。

## 申請する

AppStoreへの申請は、手順が多く大変です。(特に一番始めは)
「 AppStore　申請 」で検索すると、手順を説明している記事がたくさんヒットするので、参考にしながら準備を進めました。

画像の加工をあまりしたことがなかったので、アイコンやスクリーンショット(アプリの紹介用の画像)を作成するのに少し苦労しました。
スクリーンショットはKeynoteで作成しています。

参考になった記事↓

[iOSアプリを登録、申請して公開するまで](https://i-app-tec.com/ios/app-release.html)
[App Store提出用のスクリーンショットを無料で自作する](https://yaba-blog.com/app-store-screenshot/)

### 結果を待つ

申請に関する記事を読んでいると、機能不足でリジェクトされている方が多く、恐怖していました。
が、次の日の昼ごろには審査通過の通知が届き、拍子抜けしました。

シンプルなアプリですが、AppStoreに公開されているのをみたときは感動しました。

## 学習管理アプリを開発し始める

Webアプリを作成している頃から、ネイティブアプリ版を作成してみたいと思っていたので、作成に取り掛かることにしました。
APIはWebアプリと同じものを流用しています。iOS版用に機能を追加したりはしました。
APIと通信して、画面に表示させるだけですむ部分も多かったので想定よりもスムーズに進みました。

### 大変だったこと

- メモリ管理

それぞれの投稿にアイコン画像を表示しているため、画面に表示される画像の量が多くなってしまい、メモリ不足が発生していました。
画像を圧縮してサイズを小さくすることによって、解決しました。
加えて、通信量を減らすために画像データをRealmを使ってキャッシュするようにしました。

- SwiftUIでは実装できない

まだ新しいフレームワークであるため、サポートされていない機能があります。
ただ、UIKitの部品をSwiftUIで使用することができるので、全く実装できないということはありませんでした。

## 二回目の申請

二回目なので、スムーズに準備が進みました。
メモアプリに比べて力を入れているので、アイコンやスクリーンショットの完成度を高めることにしました。
前回の時は、アイコンの手を抜いていましたが、今回は少し力を入れました。

参考にした記事↓

[イラレやフォトショ要らず！アプリアイコンをCacooで作ろう](https://cacoo.com/ja/blog/how-to-create-app-icons-easily-with-cacoo)

### リジェクトを経験する

リジェクトされました。ただ、想定済みでした。
というのも、ユーザー投稿機能があるアプリには「ブロック・通報機能」をつける必要があるのです。
先に実装方法を考えておいたので、すぐに実装・テストして、即日再申請しました。

### 申請が通る

まだ不十分と言われたらどうしようかと思っていましたが、杞憂でした。
無事にAppStoreに公開され、アプリが稼働しているのを確認できました。

# まとめ・反省

- アイデアについて

メモアプリは飽和していますし、学習管理アプリもWebアプリ版の焼き直しみたいなものなので、オリジナリティに欠けると感じています。
もっと実際的なアプリを開発したいと考えているので、企画を練る段階を大事にしたいと思いました。

- 独学について

独学の限界を感じることが多くなってきました。問題解決を全て自分でしないといけないのは、メンタル的になかなかしんどいです。調べて解決方法が出てくるならいいですが、全く原因がわからないエラーに遭遇すると絶望します。
まあ、なんとかアプリは完成できているのでどうにかして解決しているのですが、勉強効率は悪いと思います。

- 開発のルールについて

[Webアプリ版の記事](https://qiita.com/nizi24/items/d12e9642b9774670a6ae)でも書いているのですが、一人で開発しているとルールの徹底が難しいと感じました。コミットやブランチを切る時の粒度、開発順序、コーディングルールなどは自分の裁量と気分で簡単にねじ曲げられるので、徐々に雑になりがちです。
初期段階でルールを考えておくべきだと感じました。


# これからについて

いいアイデアが浮かんだら、またアプリ作りたいと思います。
とりあえず、今月は基本情報の本番なので気を引き締めて頑張ります。
4月の応用情報も受けれたらと思っているので、そちらも勉強を進めていきます。
また、UIKitとStoryBordを使用したアプリ開発も学習したいと考えています。
良さそうな学習リソースが見つからないので、ご存知の方コメントしていだけると幸いです。