0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

掃除が続かないので、掃除の予定を管理するiPhoneアプリ「Cleeky」をExpoで作りました

0
Posted at

作ったもの

「Cleeky(クリッキー)」という、部屋ごとに掃除を登録して「今日やること」だけを表示してくれるiPhoneアプリです。

自分にはもともと、掃除をする習慣がありません。気が向いたときにやるだけで、何をいつやるかも決めていませんでした。そんな自分でも、掃除を意識できるようになる仕組みがほしくて作りました。

今日の画面

この記事では、アプリの中身を軽く紹介してから、作っていて気をつけたことを書きます。

どんなアプリか

使い方は単純で、最初にキッチンや浴室などの部屋と、おすすめの掃除(シンクを洗う、排水口を掃除する、など)を選びます。あとは掃除ごとに頻度を「毎日」「曜日指定」「N日ごと」から決めるだけです。そうすると、その日にやる掃除だけが「今日」の画面に出ます。終わったらタップしてチェックを付けます。

やり忘れた日の分は、履歴から「実際にやった日」を選んであとで記録できます。

続けるための仕掛けも入れました。

  • 掃除の時間に通知が届く(仕事の日は朝に1回、休日は食事の時間に最大3回。その日の掃除を1つ終えると、残りの通知は止まります)
  • 続けた日数の「連続記録」と、7日ごとにもらえる「おやすみ券」(うっかり休んでも記録が途切れない)
  • 集まる「ごほうびシール」
振り返り ごほうび

データは端末の中のSQLiteと、自分のiCloudにだけ保存します。自分のサーバーは持っていないので、アカウント登録もありません。機種変更のときは、iCloudから前のデータを戻せます。

有料プラン「Cleeky プラス」

「今日は10分しか使えない」という日に、その時間に収まる分だけを今日の予定にしてくれる「自動の毎日プラン」と、ホーム画面のウィジェットが使えます。

予定の決め方 Cleeky プラスの機能

使った技術

Expo SDK 57、React Native 0.86、TypeScriptです。画面遷移はExpo Router、データはexpo-sqlite、通知はexpo-notifications(ローカル通知だけ)、課金はexpo-iap、ウィジェットはexpo-widgets、iCloudはreact-native-cloud-storageを使っています。ビルドと配信はEASです。

サーバーがないぶん、バックエンドの開発や運用はありません。そのかわり、データが端末の中にしかないので、バックアップと復元は最初から作りました。

作っていて気をつけたこと

フォルダの分け方と、importのルールをESLintで縛った

機能が増えても迷わないように、先にフォルダの決まりを作りました。「今日」「部屋」「履歴」のように機能ごとにフォルダを分けて、その中をさらに4つに分けています。

src/
  app/          ルーティングだけ(Expo Router)
  features/
    <機能名>/
      ui/              画面
      application/     1つの操作の手順
      domain/          型と計算だけの、純粋なTypeScript
      infrastructure/  SQL、ファイル、通知など外とのやり取り
  shared/        2つ以上の機能で使うもの

決まりは文書に書くだけだとすぐ守られなくなるので、「uiからinfrastructureは触らない」「domainではReactもExpoも使わない」といったimportのルールを、ESLintで自動で確かめるようにしています。npx expo lint を通さないと終われないので、うっかり破れません。

日付は文字列で渡す

掃除アプリは「今日」と「次にやる日」の計算が中心なので、日付のバグが一番こわいところでした。そこでdomainの関数は日付を 'YYYY-MM-DD' の文字列で受け取り、関数の中で new Date() を呼ばないことにしました。「今日」を引数で渡す形にしたので、テストでは好きな日付を入れられます。

テーブルの変更はマイグレーションで足していく

スキーマのバージョンは PRAGMA user_version で管理しています。公開済みのバージョンのSQLは書き換えずに、変更は新しいマイグレーションとして足します。もう入れてくれている人のデータを壊さないためです。

通知が二重に予約されるバグ

ローカル通知は7日分を先に予約しておく作りにしています。完成後に点検したところ、予約の作り直しを続けて呼ぶと、同じ通知が二重に予約されることがわかりました。作り直しを1つずつ順番に実行するようにして直しました。連続で呼ばれたときの動きは、画面を触っているだけだと気づきにくいので、意識して確かめたほうがいいところだと思います。

Expo Goが使えなくなった

途中で、iPhoneのExpo GoがSDK 58専用になって、SDK 57のこのプロジェクトを開けなくなりました。そこで、SDK 57のまま expo-dev-client の開発ビルドで実機を確かめることにしました。SDKを上げるのは、審査が通ってから別のブランチでやることにしています。

mainに入れたらTestFlightまで自動で届く

EAS Workflowsで、main にpushすると「型チェック、lint、テスト、iOSの本番ビルド、TestFlightへの提出」まで自動で動くようにしました。無料プランはビルドの回数に上限があるので、アプリの中身が変わったときだけ動くように絞っています。審査への提出は毎回Appleの審査が要るので、手動のままです。

審査でつまずいたところ

初めての提出で引っかかったことを、メモとして書いておきます。

  • プライマリ言語が「英語(アメリカ)」のまま作られていて、英語のページにも説明文やURLの入力が必要だった。
  • 審査用の連絡先の電話番号は、先頭の0を取って +81 を付ける。
  • 審査から「情報が足りない」という問い合わせが来た。却下ではなく、実機の画面録画と、アプリの目的・使い方・使っている外部サービスの説明を求められた。先に用意しておくと慌てずに済む。
  • 有料プランは、説明文に値段、期間、自動更新、解約のしかた、利用規約とプライバシーポリシーのリンクを書く必要がある。

おわりに

自分で作ったアプリを使い始めてから、通知が毎日のように届くようになりました。それだけのことなのに、「そろそろ掃除しないと」と思う場面が増えて、掃除への意識が前よりわくようになりました。掃除の習慣がない自分には、これが一番ありがたい変化でした。

使ってみての感想や「こんな機能がほしい」があれば、コメントかサポートページで教えてもらえるとうれしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?