新卒エンジニアが２週間でiOSアプリを開発した全て

ブログだけだとあまり読まれないのでQiitaにも初投稿。
[こちらのブログ](https://memorandumrail.com/)にも記載しています

先日、自身で制作した初めてのiOSアプリがApple Storeに公開されました。
今回制作したアプリは<a href="
https://itunes.apple.com/jp/app/%E3%82%B9%E3%82%B0%E3%83%8E%E3%83%9F/id1429755676?mt=8" target="_blank">スグノミ</a>というアプリです。

こちらのアプリを制作するにあたって難しかったことや感じたことなどをつらつらと書いていきたいと思います。

<h2>今回制作したアプリ</h2>
今回、アプリ制作をするにあたって「とにかく何でもいいからApp Storeに公開する」という目標を立てていました。

新卒で入ったので早5ヶ月になりますが、なんでもいいのでとにかく1つアウトプットが自分の中でほしいなあと思っていたことが大きな理由になります。

ですから、とにかく今回は複雑な機能を一切設けず、”簡単”かつ”スピーディー”ということだけを重視しています。

上記のことを考えた上で、どのようなアプリを作ろうかなと考えていたのですが、就職で上京したとき友人と飲みにいったときに「どこのお店に行けばいいかわからない…」と感じていたので簡単に居酒屋を勧めてくれるアプリを作ろうと考えました。

したがって、今回制作したアプリの要件をまとめると
・簡単に近くのお店を選んでくれる
・デザインや実装の綺麗さなどは全無視
・公開までは頑張る
という条件さえ満たしていればオッケーということで進めました。

<h2>制作したアプリ</h2>
今回制作したアプリの機能としては、

・人数、予算、こだわり条件を決める
・APIからランダムに1つだけ店を表示する
・店が見つからないときは専用のページを表示する
・初回だけ位置情報を求めるページを見せる

といった最低限の機能だけ用意しています。良く言うと最近流行りの無思考型サービスと呼べるアプリかもしれないです。

これだけなら技術的にも簡単ですし、全て実装のイメージができるので最初は3日で作れるかなあと踏んでいました。

実際には2週間かかっているものの審査などの手順に対する理解がなかったこと、3回のrejectを食らったことなどを考えるとまあまあ妥当な期間で納まったかなという印象です。

<h2>iOSアプリを制作した感想</h2>
業務でReact Nativeを書いているので、技術としてもReact Nativeを採用しました。

React Nativeを利用すると1つのソースでiOSアプリとAndroid両方制作できるので、両方同時公開ということも考えたのですが、ライブラリ周りで苦戦することが目に見えているので今回はiOSアプリだけに絞りました。（業務でAndroidアプリを開発しているということもある）

App Storeのは審査が厳しいという話も聞いていたので、今回のような簡単なアプリは機能的にrejectされるかもしれないという不安もありつつ、rejectされたときに考えようということで進めていきました。

ただ、正直言うと思っていたほどiOSアプリの申請も厳しくはないと思いました。今回、3回のrejectを喰らいましたが、どれも理由はきちんと明記されていましたし、英語さえきちんと読めれば審査はそれほど難しくないのでは？というようにも感じています。

<h2>iOSアプリの審査について</h2>
今回、rejectされた主な理由は大きく2つの理由があって「iPadのViewに対応していない」「位置情報を取得するアラートのメッセージがない」という2点でした。

このあたりは、実際に制作してみてから気づくことなので、やってみてよかったなと感じますね。

もちろん最初から隅から隅まで<a href="https://developer.apple.com/jp/app-store/review/guidelines/" target="_blank">Apple Store Reviewガイドライン</a>を確認しておけばいいだけの話なんですけど、これを全て抜けもれなくやるのって結構大変なんですよね。

それよりは何回かrejectを食らって「自分はこういう理由でrejectを喰らいやすい」というパターン化してしまった方が個人でアプリを作成するにあたってはいいのかなと感じます。

<h2>アプリを制作して感じたこと</h2>
今回、初めてのiOSアプリを制作したわけですが、やはりプロダクトを完成させるとなると1つの経験になるわけです。

その中で感じたことを当たり前だろ！と思うことも含めてつらつら書いていきます。
<h3>設計は大切</h3>
今回、React Nativeを採用したにも関わらず、各コンポーネントに状態を持つステートフルコンポーネントとして実装しました。（そのほうが早く実装できると思ったので）

しかし、今回のような非常に簡単なアプリを制作するだけでも設計をちゃんとしていないことによる影響は大きかったと感じます。

例えば、位置情報取得を求めるウォークスルー画面は後で実装したものなのですが、位置情報を取得するタイミングが変わるので分離が必要になりましたし、ステートフルにしたために追加機能を考えたときに簡単に実装できないといった問題もありました。

設計の重要さは頭ではわかってはいるものの、今回の経験を通して実際にその大事さを実感できたというのは大きな経験になったと感じています。

今回は別ですが、アプリを作るにしても作って終わりではないと思います。何か機能追加やアップデートを繰り返すものなので設計を固めて少しでもキレイなコードを意識することがいかに大事かということが認識できました。

<h3>デザインもできるだけ最初に決めよう</h3>
僕はエンジニアでデザインツールなども持っていないので今回は、パワーポイントで全ての素材を作成しましたw

まあその結果当然見た目はしょぼくなるのですが、もう少し本格的にアプリを作ろうと考えたときには、ちゃんとデザインツールを使うべきかなと感じますね。

今回も少しだけ利用しましたが最近であれば、<a href="https://www.figma.com/" target="_blank">Figma</a>という無料ツールが非常に使いやすそうでいいですね。

エンジニアでも簡単に使えるツールと評判ですので、こういったツールも使っていけたらと思っています。

<h3>アウトプットは大切</h3>
今回、facebook以外でこのアプリを特に宣伝しなかったのですが、意外と出しただけでも好評でした。

やっぱり自分が何かしら考えて手を動かしたものに対して反応が来るのは嬉しいものです。

こんなんが実現できる！とは言ってもアウトプットがなければ、砂上の楼閣です。おもしろいと感じたものに対して自分でどんどんアウトプットを今後も作っていきたいと感じました。

<h2>まとめ</h2>
最後になんだかんだ大変なことはあったもののやっぱり開発することは楽しいなーと感じます。

自分が思い描いたものが形になっていくのは、楽しい以外のなにものでもありませんよね。

今回は、非常に簡単なもので完結しましたが、次回はもう少ししっかりしたものを作りたいと考えているので今後にご期待ください！