作ったもの
「Cleeky(クリッキー)」という、部屋ごとに掃除を登録して「今日やること」だけを表示してくれるiPhoneアプリです。
自分にはもともと、掃除をする習慣がありません。気が向いたときにやるだけで、何をいつやるかも決めていませんでした。そんな自分でも、掃除を意識できるようになる仕組みがほしくて作りました。
- App Store: https://apps.apple.com/jp/app/cleeky/id6826464768
- 無料です(月300円・年1,500円の有料プランがありますが、基本の機能は全部無料で使えます)
- ログイン不要、広告なし
この記事では、アプリの中身を軽く紹介してから、作っていて気をつけたことを書きます。
どんなアプリか
使い方は単純で、最初にキッチンや浴室などの部屋と、おすすめの掃除(シンクを洗う、排水口を掃除する、など)を選びます。あとは掃除ごとに頻度を「毎日」「曜日指定」「N日ごと」から決めるだけです。そうすると、その日にやる掃除だけが「今日」の画面に出ます。終わったらタップしてチェックを付けます。
やり忘れた日の分は、履歴から「実際にやった日」を選んであとで記録できます。
続けるための仕掛けも入れました。
- 掃除の時間に通知が届く(仕事の日は朝に1回、休日は食事の時間に最大3回。その日の掃除を1つ終えると、残りの通知は止まります)
- 続けた日数の「連続記録」と、7日ごとにもらえる「おやすみ券」(うっかり休んでも記録が途切れない)
- 集まる「ごほうびシール」
データは端末の中のSQLiteと、自分のiCloudにだけ保存します。自分のサーバーは持っていないので、アカウント登録もありません。機種変更のときは、iCloudから前のデータを戻せます。
有料プラン「Cleeky プラス」
「今日は10分しか使えない」という日に、その時間に収まる分だけを今日の予定にしてくれる「自動の毎日プラン」と、ホーム画面のウィジェットが使えます。
使った技術
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を付ける。 - 審査から「情報が足りない」という問い合わせが来た。却下ではなく、実機の画面録画と、アプリの目的・使い方・使っている外部サービスの説明を求められた。先に用意しておくと慌てずに済む。
- 有料プランは、説明文に値段、期間、自動更新、解約のしかた、利用規約とプライバシーポリシーのリンクを書く必要がある。
おわりに
自分で作ったアプリを使い始めてから、通知が毎日のように届くようになりました。それだけのことなのに、「そろそろ掃除しないと」と思う場面が増えて、掃除への意識が前よりわくようになりました。掃除の習慣がない自分には、これが一番ありがたい変化でした。
使ってみての感想や「こんな機能がほしい」があれば、コメントかサポートページで教えてもらえるとうれしいです。