React Native (Expo) を使ってはじめてのモバイルアプリ制作　きっかけから制作、公開まで

昨年末12月28日にはじめて制作したアプリを App Store に公開しました。
[![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21879/3a39349d-7924-35f8-59c8-2a6c9028eefb.png)](https://apps.apple.com/us/app/tagtimelog-lite/id1492996850?mt=8)
"[tagTimeLog Lite](https://apps.apple.com/us/app/tagtimelog-lite/id1492996850?mt=8)"

タグを使って時間を記録するアプリです。かなり単純なアプリです。
モバイルアプリを開発したきっかけから制作、公開までをまとめました。

## きっかけ

複数の仕事が重なり、それぞれのプロジェクトごとに実際にどれだけの時間を消費しているのか計測したいと思い、既存のアプリを探していくつか試して見たのですが、自分が欲しいと思うようなシンプルで手軽なアプリが見つかりませんでした。
アプリを探すのにも疲れたので「仕方ない、自分で作るか」ということで一念発起してアプリ開発を思い立ちました。 
仕事で使っている WordPress でも導入された React の勉強もしなければならなかったので、 React を使ってアプリを作れば一石二鳥ということで無駄になることはないと自分を納得させて開発を開始しました。

## 仕様

自分が欲しいと思ったアプリの仕様。

- 操作がわかりやすい
- シンプル
- 少ないタップ数でログが取れる
- 動作が早い
- ログイン不要
- エキスポート機能
- メモを取れるようにする
- ログの時間を修正できるようにする

最初からこのようにリスト化するようなことはせず、何となくこんな感じでとぼんやり考えながら作っていきました。
制作途中であれも欲しい、これもあったらいいなと思いつくことがありましたが、元々の「シンプルで手軽」という基本コンセプトととりあえず早く公開することを優先して機能を絞り込みました。
そもそも技術がないので複雑なことはできませんし。

集計自体はスプレッドシートで行う予定でしたので、CSVファイルへのエキスポートは必須でした。

## ブラウザベースかモバイルネイティブか

React を使用することを前提としていましたが、React 自体を全く理解しておらず、React Native(モバイル用フレームワーク) 以前の話だったので、 React を使ってブラウザベースで制作することにしました。

## JavaScript の再学習

これまで jQuery を何となく使ってきた程度の JavaScript の知識だったので、React を学習するには、 JavaScript の知識が全く足りず、まずは JavaScript の学習から始めました。
React においては ES6以降 を使っての制作が基本なので ES6 を中心に JavaScript を学習しなおしました。

### JavaScript の学習に使用したWebサイトや書籍

- [MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript)
- [開眼! JavaScript](https://www.oreilly.co.jp/books/9784873116211/)
- [改訂新版JavaScript本格入門](https://gihyo.jp/book/2016/978-4-7741-8411-1)

## React の学習

JavaScript をある程度学習できたので React の学習です。
個人的には、React の重要なポイントは state のように思いました。
あとは JavaScript (ES6) の知識で書ける感じです。
なので、もし、React の学習に躓いている方がおられたら JavaScript の知識について少し見直してみても良いかもしれません。
少し難しく感じたのは、ルーティングのところでの props や値の受け渡しです。
コンポーネントの構成をどうすればよいのか迷いました。
あと、 JSX は慣れるしかないと思います。

### React の学習に使用したWebサイトや書籍

- [React: Docs and Tutorial](https://reactjs.org/)
- [codecademy: Learn ReactJS](https://www.codecademy.com/)
- [Reactビギナーズガイド](https://www.oreilly.co.jp/books/9784873117881/)
- [速習 React](https://www.amazon.co.jp/速習-React-速習シリーズ-山田祥寛-ebook/dp/B07GWFRCR1)

React の勉強には[公式サイト](https://reactjs.org/)が最も役に立ちました。
本などは少し古かったりするので、先ずは公式サイトで勉強し、わからないところを本で補うようにしました。

## React を使ってブラウザベースのアプリを制作

[Create React App](https://github.com/facebook/create-react-app) を使って作成しました。 
勉強しながらの制作だったので、あらゆる所でつまずきましたが、公式サイトや書籍、Web 上の情報を参考にしながら一定ペースを保って完成までたどり着きました。
アプリ制作のおかげで React の概要については、おおよそ理解できたように思います。

### 使用したライブラリー、データベース

- ライブラリー: react-router-dom
- データベース: IndexedDB

ライブラリーは 、react-router-dom を入れました。
データベースは、ブラウザ用のローカルストレージ IndexedDB を使いました。

react-router-dom の勉強には「速習 React 速習シリーズ」、 IndexedDB の勉強には [MDN] (https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) が非常に参考になりました。というか、IndexedDB には、 MDNしかないと思います。

### ブラウザベースからモバイルへ

最初に希望していた機能は、ほぼこのブラウザベースのアプリで満たしており、完成後しばらくアプリを使用していました。
しかし、使用していて少し不安になることがありました。
それは、データベースの IndexedDB です。

IndexedDB は個人的には使いやすく非常によいデータベースだと思うのですが、ブラウザ依存のデータベースなので、例えば何かの理由でブラウザをアンインストールしてしまうとデータベースも消えてしまいます。
私が Web サイト制作を仕事にしていることもありブラウザの設定を変えるなど、荒い(?)使い方をする場合もあるのでブラウザ依存のデータベースを使用していることが少し不安でした。

そこで、React の思想「Learn Once, Write Anywhere」を思い出し、専用のアプリであればアンインストールするようなこともないため、「仕方ない、React Native を使ってモバイルアプリを作るか。」ということでモバイルアプリの制作を開始しました。

## React Native (Expo) を使ってネイティブモバイルアプリを制作

React で作成したアプリを React Native で作り直しです。
React Native であっても一部ネイティブ言語を触る必要があります。
ネイティブ言語は触りたくない(勉強したくない)ので、 Expo を利用することにしました。
Expo は、実装できる機能の範囲が狭まるようですが、最初から最後まで JavaScript だけでアプリ公開できるようになる React Native 向け支援ツールだそうです。

React と React Native の違いとしては、根本的なところは React とほぼ一緒だと思いますが、見た目の構築とルーティング(画面遷移)の設定は、まったく違うように思いました。
全体的に組みなおす必要がありました。
モバイルと比較して Web のほうが自由度が高いので、もし、モバイルと Web で、見た目を同じにしようと考えているのであれば、モバイルから作成したほうが良いように思いました。

### React Native (Expo) の学習に使用したWebサイトや書籍

- [React Native](https://facebook.github.io/react-native/)
- [expo](https://expo.io/)

React Native については、Web 、書籍ともに日本語化されているものが少なく、基本的には英語で書かれている公式サイトを見て勉強しました。
英語がわからないので理解するのにかなり時間がかかってしまいましたが、Google 翻訳など利用しながら、とりあえず制作できるところまでは理解できました。

### 使用したライブラリー、データベース

package.json の中身です。

- expo
- expo-ads-admob
- expo-sharing
- expo-sqlite
- papaparse
- react
- react-dom
- react-native
- react-native-elements
- react-native-gesture-handler
- react-native-keyboard-aware-scroll-view
- react-native-reanimated
- react-native-svg
- react-native-swipe-list-view
- react-native-web
- react-navigation
- react-navigation-stack
- react-navigation-tabs
- sentry-expo

### ライブラリー、データベースで気になったところ

#### Expo
JavaScript だけでアプリの制作から申請まですべてできるのは大変ありがたいです。
ただ、ちょっと気になるのはアプリのファイルサイズが大きくなるということです。
Expo を使用すると仕方がないことらしいのですが、確かにより複雑なことができる他の Swift などで作られたであろうと思われるアプリと比較すると、ちょっと大きいなという感じがしました。
今後ブラッシュアップして小さくできるか確認していきたいと思います。

#### react-navigation
React から React Native に移行して最も戸惑ったのがルーティング(ページ遷移)です。
React の "react-router-dom" とまったく違うように感じました。

#### react-native-swipe-list-view
当初、"react-native-swipeout" を使っていたのですが、expo をアップデートしたところエラーが出るようになったので、"react-native-swipe-list-view" に変更しました。

ライブラリーは、大変便利でありがたいのですが、アップデートに対応されていないと代替ライブリーがない場合は、アプリ自体が更新できないことになってしまうので、依存度はなるべく低くした方が良いと思いました。

#### expo-ads-admob
ローカル環境でのテスト広告や publish 後の正式広告は、すぐに表示されるのですが、iOS App Store 公開、申請後はすぐに表示されず、2、3日後に表示されるようになりました。
他の方のブログなどを見ていると普通にそれぐらい待たされることがあるようです。

#### sqlite
データベースは、 sqlite を使いました。当初は、 realm を使いたいと思っていましたが、Expo が対応していなかったので仕方なく sqlite にしました。
sqlite を使ってみたところ特に問題なく使えてますので、とりあえず良かったです。


## App Store (iOS) への申請と公開

### 担当者によって厳しさが違う?
App Store (iOS) への一度目の申請は、一発 OK で何の修正命令もなく翌日には公開となりました。
Apple の審査は、厳しいと思っていたので意外でした。
公開翌日に見た目のところを少し調整してアップデートし、審査申請に出したところエラー表示され修正命令が来ました。
修正内容は「アプリの名前がガイドライン違反してるので名前変えろ」(英語わからないのでおそらくこんな感じ)でした。ガイドラインでは「アプリの名前に金額を表すようなワードは入れるな」ということらしいです。
現在のアプリ名は "tagTimeLog Lite" なのですが、最初の申請時は "tagTimeLog Free" という名前で申請していました。
この "Free" が金額を表しているようです。
私の勉強不足だったので反省なのですが、いくらなんでも最初の申請時に気づかなかったのかなと思いました。
Apple の審査が早くなったとどこかで読みましたが、担当者によって能力に差があり、一部で審査が甘くなっているのかもしれません。

名前を変更し、再審査を依頼、2、3日後に無事通過して公開となりました。

## 思いつきから制作、公開までの期間

思いつきから公開まで、ほぼ一年かかりました。
通常の受注仕事しながらなので、途中一ヶ月くらいまったく触れなかたということもあるので、ざっくりですが、実質4、5ヶ月くらいでしょうか。

特に学習面で React については、公式含めて教材となるような、日本語で記載されている Web サイトがたくさんあるのですが、React Native では日本語がガクッと減って、ほぼ英語で記載されている Web サイトでした。英語が苦手な私は React Native の学習段階でかなり時間を取られた印象です。

## アップデートの予定

今後は下記内容を予定してます。

- Android 版作成
- 他の形式による時間表示
- ダークモード (iOS)
- 有料版作成
ほか



以上