日記と家計簿を同時管理できるアプリをリリースした【React Native】

**家計簿日記 CashDiaryという、日記と家計簿を同時管理するアプリを作りました。**
開発した経緯、技術選定理由や詰まった箇所を忘れないために、記録を残します。

![名称未設定のデザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/dd422823-ee99-168a-bd98-859b0826bb21.png)


## 作った理由
- 仕事でReactとTypeScriptを使用していますが、現在のバージョンではhooksを使えていないため、新たにhooksを学習するための機会を作りたかった
- 日記と家計簿を別々のアプリを使用するのは煩わしい…自分で作るか！となった。
- UnityでiOSゲームをリリースしたことはあるが、ツール系のアプリも作りたかった。

## 個人的要件
- １ヶ月でリリースできる
  - 最低限の機能のみ実装した(リスト、新規作成、編集、詳細画面のみ)
  - ~~結果的に２ヶ月ほどかかってしまいました~~
- 運用コスト0
  - FireBaseやAWSは一切使用せず利用料0にする。フロントのみで完結させる


## 技術選定
- ReactNative
  - 前述の通り、hooksの学習をしたかった
- TypeScript
  -  React使用するには必須のため
- expo
  - ~~expoを使用しないと色々と面倒らしいため~~
- expo-sqlite
  - FireBase等のサービスを使うとお金が掛かる。毎月コストなしで運用したかったため。しかしこれぐらいの規模なら無料プランでおさまったかもしれない・・
- EAS
  - react-native-google-mobile-adsはexpoに対応していないとのことで、EASを使用してビルド、ストアに提出した
 

## 開発途中詰まったところと備忘録
### Admobの実装
react-native-google-mobile-adsを使用してAdmobを実装したかったが、expoでは対応していなかった。
そのためEASで実装が必要になる。

https://zenn.dev/hal1986/books/react-native-monetize/viewer/1_admob

### app.jsonの値を動的に変更したい
アプリの各種設定（アイコン・スプラッシュ画像）は、`app.json`に記述するが、
動的に変更したい場合がある。
その場合は、`app.config.js`を作成してルートディレクトリに配置する。

https://qiita.com/takahi5/items/0d058bd2c5cf40ae886a

### EASのよく使うコマンド
開発用実機iOSにビルド
`eas build --profile preview --platform ios`

iOSシミュレーターににビルド
`eas build --profile development-simulator --platform ios`

### expoのよく使うコマンド
expo起動
`npx expo start --dev-client`

### iOSで実機テストしたい場合
`eas device:create`で対象デバイスを追加する
またiOS16の場合、デバイス側でプライバシーとセキュリティ　→　デベロッパモードをONに設定する必要あり

### EASの環境変数設定
`app.config.js`に環境変数を設定する場合

1.　`app.config.js`に以下を追加する
```app.config.js
    "extra": {
      APP_ID: process.env.APP_ID
    }
```

2. 以下のコマンドを実行して、環境変数を登録する

`eas secret:create --scope project --name key --value value`

3. 設定されたことを確認する

`eas secret:list`

https://www.wheatandcat.me/entry/2022/05/26/091557

### .gitignoreにあるファイルはEASビルド対象外になる
`.gitignore`にあるファイルはEASビルドの対象外になる
`.easignore`を追加すると、こちらの設定が優先されるので、ファイルをルートディレクトリに追加する。
すべて空白にすると、`.gitignore`に記載されていても、対象になります。

https://www.wheatandcat.me/entry/2022/05/26/091557

### AppStoreでの提出時は毎回、buildNumberをインクリメントする
`eas submit -p ios`でAppStoreに提出したら、
次に提出する際は、buildNumberをインクリメントする必要がある。
また、この際、ルートディレクトリにiOSディレクトリがあると、
そこの`plist`の設定が優先されるため注意

```app.config.js
  "expo": {
    "ios": {
      "buildNumber": "X"
    }
  }
```

### EASストア提出の手順

https://docs.expo.dev/submit/introduction/

### ビルドしたアプリを別のiOSシミュレーターで起動
Simulator
Simulator →　File →　NewSimulaterで　デバイスを追加
File →　Open Simulator → デバイスを選択

![スクリーンショット 2023-05-25 21.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/7aa31d2c-3307-85a4-77f4-fc75da80705b.png)

Expo　IOを開いて、BuildDetailsからアプリをDownload
appをデバイスにD&Dする

### AppStoreで必要なスクショ
以下の解像度のスクショは必須になる

- 6.5インチ　1284 x 2778 pixels　(portrait)
- 5.5インチ　1242 x 2208 pixels　(portrait)
- 12.9インチ 2048 x 2732 pixels (portrait)

https://developer.apple.com/help/app-store-connect/reference/screenshot-specifications

## 課題
### 再レンダリングを意識する
再レンダリングによるパフォーマンスを意識できてなかったため、useMemoやUseCallbackを活用する

### Atomデザインを適用する
愚直にスクリーン毎、機能毎にコンポーネントを作っていた。Atomデザインを適用したい。

### 総評
ReactNativeでの開発が初めてということもあって、時間がかかってしまった。
途中からChatGPT4を使用し始めたので、効率が上がった気がする。
あと、React Nativeのメリットを活かすためにandroid版も出したい。