アプリ開発未経験者がiOSアプリをストアに公開した話

# 概要
プライベートで勉強のためにずっとSwiftでiOSアプリ開発をしてまして、それがやっとひと段落してAppStoreに公開することができました。
気づけば無駄に長い道のりでしたが何とかストアの公開までできたので、アプリ開発経験が実質ゼロだった状態からリリースまでの道のりをまとめておこうと思います。

# 作ったもの
まずは作ったものを簡単にご紹介します。
とてもシンプルなアプリです。
<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/110485/ec48c396-39a9-c48e-714c-54543c7f9c7c.png" width="200">
https://itunes.apple.com/jp/app/meshi-log/id1173943494

自分が食べた写真をメモと一緒に管理できるアプリです。
いつ何を食べたかまとめておきたいなーと思って作りました。

# スキルセット
まずは自分のスキルセットを軽くご紹介しておきます。
仕事では**基本的にPHP**をメインで触っています。(あとはjsを少々。。)
**アプリ開発は実質未経験**です。実質というのは一応仕事で少しだけiOSアプリを触ったことがある程度です。(当時はObjective-Cのコードで簡単な保守をやった程度です。。)
なのでほぼアプリの開発はやったことが無いに等しいレベルだと思ってもらって良いと思います。

# アプリ開発の目的
まずそもそもなぜアプリ開発を始めたのか軽くご説明したいと思います。
自分は仕事で基本的にPHPを触る事が多く、それ以外の言語はなかなか触れていない状況でした。
世の中的な流れとしてははウェブよりアプリが多く使われていると言う中で、アプリを作れないと言うのはやばいよなと言う**危機感**からSwiftの勉強を始めました。
Swiftにした理由も単純で、プライベートではずっとiPhoneを使っていたのでネイティヴのアプリを開発するならiOSでSwiftだよな！と思ってSwiftの勉強を始めました。

勉強するにあたってゴールを決めようと思い、「アプリ開発ができる」って何だろう、どうゆう状態だろうと考えた時に**「一人でゼロからアプリを作ってAppStoreに公開した事がある！」**事だと自分の中で定義しました。

もちろん「アプリ開発ができる」=「一人でゼロからアプリを作ってAppStoreに公開した事がある」が絶対だとは全く思っていないですが、仮に自分がゼロからアプリを作ってAppStoreに公開までできたとしたらアプリ開発のある程度のノウハウとスキルはつくんじゃ無いかなと思いました。それができれば**アプリ開発未経験者からすると大きな経験と自信にも繋がる！**だろうと思っていました。
さらに、それができれば**その後はもっと深い部分を学んだり、また別のアプリを作ったり**というスキルアップもしやすいだろうと思い、まず最初はAppStoreの公開までをゴールに設定しています。

なので正直作るアプリは何でもいいと思っていました。それこそ単純な電卓アプリとか、メモ帳アプリとかでも全然よくて、重要な目的は**「一人でゼロからアプリを作ってAppStoreに公開した事がある！」**と言う事なのでそこにフォーカスしようと思いました。
(ちなみに後から詳しく説明しますが単純な電卓アプリやメモ帳アプリではおそらくAppStoreには公開できないのでそれだと今回の目的を満たせないですが。。)

# 勉強時間、開発期間
まずアプリ開発(Swift)の基本的な部分は本を読んで勉強してました。これ自体は結構前にやってました。
(何の本を読んでいたかも忘れてしまったレベルです。。)
今だとこの辺が参考になるかなと思います。できればSwift3に対応してるものがいいかと思います。

* [Swiftのおすすめ書籍13選！(2016年)](http://swift.tecc0.com/?page_id=435)
* [iOS アプリ開発入門本いろいろ（Swift 3 / Xcode 8 ）](http://a244.hateblo.jp/entry/2016/11/14/000541)

本を1冊読めばある程度基礎的な事は出来るようになるので、それが終わってから早速アプリの開発を始めました。開発期間は今年の4月から初めて11月にリリースしたので半年ちょっとくらいでしょうか。
(当初自分の想定ではGWにはリリースしているイメージだったのですがだいぶ遅れました。。)

当初の開発時間は週末の土日だけで、合わせて2,3時間くらいでした。
が、後からも説明しますがそれだとなかなか捗らないので途中から平日もやる気がある日は仕事後に開発したりしていました。結構不定期不規則ではありましたがそれでも丸一日開発に費やすとかはなく**地道に継続して開発するスタンスでやっていました。**
(個人的にはやっぱり土日は溜まったドラマを見たりお買い物したりしたかったので。。)

そういった開発スタンスから自分が感じた事が2つあります。
#### 1.思っている以上に開発に時間がかかる
最初にご説明しましたが自分はアプリ開発初心者です。本を1冊読めば基本的な部分は理解できるとは言ったものの、アプリの細かい仕組みやできる事、言語の仕様など、まだまだ分からない事だらけな状態なので、自分で思っているよりも開発に時間がかかりました。
これくらいだったらすぐできるだろ！と思っていても予想もしていないところではまったり、、調べたり、、しているとあっという間に時間はすぎてしまいます。
なので最初に作るアプリは出来るだけシンプルで簡単なものをお勧めします。あれもこれも機能をつけたりやりたい事はいっぱい出てくるとは思いますが、思ってる以上に開発に時間がかかると思います。まさに自分も今回のアプリは特別凄い機能とか難しい実装とかをしたわけではありませんが結果的に半年以上の時間を費やしています。**自分が初心者であると言う事としっかり向き合う**のも重要な事だと思います。

#### 2.平日もやったほうが捗る
当初は土日の一部だけしか開発の時間に当ててなかったですが、やはりそれだとどうしても開発スピードが遅いです。もちろん単純に作業時間的な問題もありますし、1週間時間が空くと思い出すのにもまた少し時間がかかったり、精神的に「自分の開発の時間」への切り替えにも躊躇が出てしまいます。
なので平日も少しでいいので作業の時間を当てるのをお勧めします。もちろん仕事があるので仕事終わりに家で開発するのが大変と言う場合もあるとは思います。それでも自分は夜10時くらいに家に帰ってきて11時から1時間だけやる、とかは割とあったので平日でもうまく時間をやりくりできるといいなと思います。
ただ**逆に毎日1時間やる！とか1ヶ月以内に作る！みたいな目標は立てないほうがいいかなと思います。**自分もそう言った目標は全く立てておらず、その日その日でやるモチベーションがあればやるスタンスでした。毎日1時間やる！みたいな目標を立てるとそれができなくなったらその瞬間に一気にモチベーションが下がって最終的に0まで落ちてしまうような事がありますし、毎日1時間やるために自分の趣味の時間を削る、みたいなことになりがちだと思うのでそうなるとむしろうまくいかないと思います。
あくまで**自分ができる範囲で無理なく継続する事**が重要だと思います。

この辺も参考になります。
[エンジニアは勉強時間を平日に作ると、技術習得が早くなる](http://www.2dgod.com/entry/2016/07/10/123000)

# 気をつけた事
今回アプリの開発を進めるにあたりいくつか重要な事や気をつけていた事があるのでそちらもまとめます。

#### 1.できるだけライブラリを使わない
アプリ開発においては使えるライブラリが数多く公開されています。iOSであればCarthageやCocoaPodsを使って様々なライブラリを簡単に使う事ができます。なので本来であれば自分で開発するよりもライブラリを使ったほうがより効率的に開発ができるので積極的にライブラリは使ったほうが良いです。が、今回の意図は**ライブラリを使わないでもできるくらいシンプルで簡単なアプリを作るべき**、というところにあります。基本的にライブラリは実装すると難しい、めんどくさい部分を誰もが簡単に使えるようにした、と言う場合が多いのである程度の規模のアプリを作るのであれば使えるライブラリは積極的に使ったほうが良いと思います。ただ今回自分はアプリ開発初心者という立場です。それを踏まえると最初はそもそも**難しい、めんどくさい実装はしないでも大丈夫なようなアプリを作る**ことを考えたほうが良いです。その意味でのライブラリは使わない方が良い、です。
あとアプリ開発初期の段階だとライブラリを入れたはいいが、ライブラリ側のアップデートや自分の環境の変化によって突然ビルドが通らなくなる、みたいな事はよくあります。そう言った時にトラブルシューティングに結構時間がかかってしまい中々前に進まない事も多いので、そう言った意味でも最初は出来るだけライブラリを使わない方向をお勧めします。

とは言いつつも、実際自分の場合は結構がっつりライブラリを使っていました。。最終的に5つくらい使っています。。(矛盾して申し訳ないですが。。)
個人的にライブラリを使ってよかった所としては開発者の方にissueを送ってやりとりができた事です。
→https://github.com/WorldDownTown/ZoomTransitioning/issues/7
ビルドエラーが出て色々調べつつ対応していたのですが、多分ライブラリ側が間違ってそうだから聞いてみようとう事でissueを投げて見たのは良い経験でした。

もしライブラリを入れる場合はこの辺を見て使えそうなもを厳選して使うのが良いかもしれません。

* [cocoacontrols](https://www.cocoacontrols.com/)
* [iOS Cookies](http://www.ioscookies.com/)
* [Awesome Swift](https://github.com/matteocrippa/awesome-swift)

#### 2.目的を意識する
今回であれば**「一人でゼロからアプリを作ってAppStoreに公開した事がある！」**を常に意識します。
アプリを作っていると結構気持ちが離れる場面が出てきます。例えば作るアプリはシンプルで作りやすい方が良いと言ってましたが、あまりにシンプルなものを作っていると**何でこれ作ってるんだっけ、、？とかこれ作って使う人いる、、？とか周りの人はもっと凄いの作ってるけど自分は、、、**みたいな事を考えてしまいがちです。
そこはしっかりと割り切って目的を意識するのが重要だと思います。何度も言いますが今回に限って言えば目的は「一人でゼロからアプリを作ってAppStoreに公開した事がある！」なので、それ以外の余計な事は考えないようにして、そう言った事はアプリをストアに公開した後で考えるようにしましょう。

#### 3.こだわらない
当たり前ですが**こだわればこだわる程時間がかかってしまいます。**また、こだわろうと思えば際限なくこだわれます。あのボタンの色を変えよう、、もっと綺麗にコードを書こう、、あの機能も追加しよう、、とか。
今回は一人で開発するので自分さえ納得できれば次に進める状態です。例えば仕事であればクライアント、ユーザー、デザイナー、企画、営業などなどステイクホルダーがある中で一定のクオリティを担保する必要がありますが一人で開発する場合は自分がOKを出せばその瞬間OKです。機能追加やリファクタリングはリリース後でもできるので、最初はあまりこだわらずプロダクトを完成させることに集中するのをお勧めします。

# デザイン未経験のエンジニアがどうやってデザインしたか
自分はエンジニアなのでデザインの事は全くわかりませんし、デザイン技術もありません。(イラレ、フォトショ等も全く使った事がありません。。)
それでも一人でアプリ開発をするのでアイコンやボタン等全て自分で何とかしないといけません。
そこでデザイン部分で自分がやった事を紹介します。

#### 1.基本は全てKeynoteで
今回自分が作ったアプリの**アイコンやボタン等、全てKeynoteで作りました。**
実際見てもらえばわかりますがアイコンも超シンプルです。笑
そんなに凝ったデザインなものは作らないという前提にはなりますが、簡単なものであれば全然Keynoteでいけます。
最近はフラットデザインという素晴らしい言葉があるので基本的には線、丸、四角を組み合わせればだいたいそれっぽいアイコンなど作れると思います。

アイコンの作成はこちらが非常に参考になりました。
→[ノンデザイナー開発者向け 学習コストをかけずにiOSアプリ用アイコンを作る方法(Mac)](http://qiita.com/seihmd/items/25f2a42e20e88ea5d86f)

Keynoteで作ったものを画像にするのはToyViewerというのが一番よかったです。
→[超おすすめ！Macで無料なのにこんなに便利すぎる画像編集アプリは「ToyViewer」しかない！](http://itea40.jp/application/mac-graphics-design/toyviewer/)

アプリのアイコンサイズとかはこの辺を参考にしていました。

* [iOSアプリの画像サイズ](http://qiita.com/Yuta/items/98b9ea2739718b9184de)
* [iPhone,iPadのアイコンなどのサイズ](http://qiita.com/k-yama/items/8003b71c272c3327a856)


#### 2.使えるフリーソ素材は使う
自分で作るよりはすでにあるものを使った方がクオリティが高いのでフリーで使える素材は積極的に使って良いと思います。探せば結構フリーでもハイクオリティのものがあります。

* [FLAT ICON DESIGN](http://flat-icon-design.com/)
* [36,700 個の無料フラットアイコン](https://ja.icons8.com/)

# いざアプリを審査インしたが3回リジェクトされた話
開発が終わって後はアプリを審査に入れるだけだ！と、ゴール目前の状態から意外とすんなり行かなかったのでその話もしたいと思います。

アプリの申請方法などはこの辺を参考にしていました。

* [iPhoneアプリ申請やAppleの審査に関するメモ](http://qiita.com/koogawa/items/5e2ff5a0312cb1f657f8)
* [[iPhone] iOSアプリを登録、申請して公開するまで](https://iphone-app-tec.com/ios/app-release.html)
* [iOSアプリ申請・公開手順まとめ 〜2016年3月版〜](http://kinsentansa.blogspot.jp/2016/03/ios-20163.html)
* [突然アプリをアップできなくなった - Missing iOS Distribution signing identity forエラーの対応](http://swift-bettychang.hatenadiary.jp/entry/2016/02/16/083013)


iOSアプリはリリース前に必ず審査が入り、その審査は結構厳しい事で有名だと思います。アップルのガイドラインもありますしGoogleとかよりもはるかに厳しい印象です。会社で自分は直接アプリ開発はしてないですが身近でやっている人がいるのでその話とかを聞いてもアップルの審査は結構厳しいです。

* [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/)
* [App Store Review Guidelines(日本語訳)](https://developer.apple.com/app-store/review/guidelines/jp/)

という前提の知識はあったものの、今回自分が作ったアプリは大丈夫だろう！と思っていましたが、、実際審査に入れると計3回リジェクトされました。。

#### 1回目のリジェクト
1回目のリジェクトが個人的には一番衝撃でした。リジェクトの理由は**「4. 2 DESIGN: MINIMUM FUNCTIONALITY」**で、簡単に言うと**機能がしょぼい**という内容です。
今まで自分が**出来るだけシンプルなアプリを作るのが良いと言う考えでやってきたのを全てひっくり返された感覚でした。笑**
今回作ったアプリは撮った写真を保存しておくアプリだったのですが、フォルダーとしての機能しか満たしていないという理由でダメだったようです。

とは言え、シンプルで機能が限られていると言うのはユーザーにとっても良い事だとは思っていて、アプリの使い方に迷わない、使いやすいと言うのはとても重要だとは思ってます。
なのでその内容をアップルのレビューに返信したのですが、アップル側は全く理解してくれず**「機能追加してください」**と返信がきて機能追加せざるを得ない状況になりました。。

なので写真を保存するだけではなく一緒にメモも保存出来るように機能を追加して再度審査に入れ直しました。

#### 2回目のリジェクト
2回目はいっぱいリジェクト理由がありました。笑

* 2. 1 PERFORMANCE: APP COMPLETENESS → **アプリがクラッシュする**
* 2. 3 PERFORMANCE: ACCURATE METADATA → **ストアに載せるメタデータが不適切**
* 4. 2 DESIGN: MINIMUM FUNCTIONALITY → **機能がしょぼい**

1つ目のクラッシュする原因はズバリこれでした。
→[iPadでUIAlertControllerのActionSheetが落ちる問題](http://qiita.com/malt/items/8937d9b7fddb29f5764a)

2つ目のメタデータに関しては、「写真をアップロード」という文言を使っていたのですが、実際にはサーバへアップロードするわけではなくアプリのローカルに保存する機能だったのでその部分のミスマッチを指摘されました。
(**正直そんな細かいとこまで見るのかと言う印象でした。**)

3つ目に関しては最初と同じ理由でしたが機能追加しているのでスルーしました。笑
1つ目2つ目の理由を潰せば大丈夫だろうと言う事で、今回はクラッシュするバグを修正して、メタデータを修正して再度審査インさせました。

#### 3回目のリジェクト
もう大丈夫だろうと思っていたのですが、またリジェクトされました。。今回もいっぱい理由がありました。

* 2. 3 PERFORMANCE: ACCURATE METADATA → **ストアに載せるメタデータが不適切**
* 5. 1.2 LEGAL: PRIVACY - DATA USE AND SHARING → **データの使用が不適切**
* 4. 2 DESIGN: MINIMUM FUNCTIONALITY → **機能がしょぼい**

1つ目は前回と同じメタデータの指摘でした。これは単純に自分の修正漏れでした。

2つ目も文言の指摘でした。今回作ったのが写真を保存するアプリなので、iPhoneの写真(Privacy - Photo Library Usage Description)とカメラ(Privacy - Camera Usage Description)のへアクセス許可をする必要があります。その際に文言を表示させる必要がるのですが、どちらも「写真へアクセスします」という文言を表示させていて、「カメラ」へアクセスした時の文言が不適切なのが理由でした。
(**これもそんな細かいとこまで見るのかと言う印象でした。。**)

3つ目の機能部分についてはまたか！と言う感じだったので**機能も追加したし、これ以上何をすれば良いんだ！？という割と強気な発言を添えて**、1,2の指摘点も修正した上で再度審査に入れておきました。

この3回目のリジェクトを受けて無事に審査が通りAppStoreにアプリが公開されました！
なので一番最初に電卓アプリとかメモアプリとかなんでも良いと言いましたが、それだと今回と同じ理由でリジェクトされる可能性があります。すでにデフォルトでiPhoneにあるような機能そのままだと4. 2 DESIGN: MINIMUM FUNCTIONALITYに引っかかると思います。
なのでプラスして何か別の機能を追加してあげれば大丈夫だと思うのでそこは注意が必要だと勉強になりました。
こういった**審査の知見も実際にアプリを作って審査に入れると言う事をやらなければ得られない経験**なので、今思うと良い経験だったと思います。

あとアップルの審査からのレビューは全て英語で返ってくるのでそれに返信する場合も全て英語でやりとりする必要があります。今回やりとりが多かったので**英語の勉強にもなった**ように思います。笑
基本はGoogle翻訳を使ってなんとかやりとりしてました。


# 最後に
長くなってしまいましたが、とりあえず無事に自分が作ったアプリがAppStoreに公開できたのでよかったと思います。アプリを作る過程で**Swiftの勉強にもなりましたし、開発からストア公開までのプロセスも一通り学べた**のもよかったと思います。
やっぱりストア公開までできると自信にもつながりますし、その自信があればこっから先またどんどん新しい事にもチャレンジできそうな気がします。この後は具体的にどうするかは決めてないですが、**機能を追加したり、リファクタリングしたり、RxSwift勉強して取り入れたり、クリーンアーキテクチャーを取り入れたり、テスト/自動ビルドの仕組みを考えたり、アナリティクスの設定したり、全く別のアプリを開発したり**とやりたい事はまだまだたくさんあります。
なので今回の経験を活かして次のステップに向けてまた頑張りたいと思います！