習慣化できないことの鬼なので習慣化のための iOS アプリを作った

なぜ作ったか

みなさんは習慣化していますか?わたしはしていません。日々なにも積み重ねず過ごして、いつの間にか人生が終わっていそうな気がしてきたので、ひとまず習慣化のための iOS アプリを探して評判の良さそうなものをインストールしてみました。

もちろん習慣化のためのアプリを使ったくらいで習慣化ができるほど世の中甘くはないので、一瞬でそのアプリは使われなくなってしまいました。ただ、最近 iOS エンジニアをやっているので任意の行動をしたい時の裏技があり、自分で iOS アプリを作ることで作ったアプリを使うためにその行動をするようになる、というものです。今回は習慣化をしたいので習慣化のためのアプリを作ってみることにしました。

どういうアプリか

シンプルな習慣化アプリです。 Todo リストがあり、過去に行ってきた Todo をカレンダーで見ることができます。 Todo の push 通知が来るとその時点で悲しすぎてやる気が0になってしまうので通知機能はありませんが、能動的に Todo を見たいときはぱっと確認できるように Widget 対応をしています。また、3日に1回くらいやれば OK な Todo もあるので、1日の終わりに全部の Todo が終わっていないといけないというような圧はかけないようにしています。理想的には3日に1回はやらないといけない、みたいな感じの設定できればいいのですが、気が向いたらやりたいと思っています。

以下のリンクからインストールできます。

Monaka - App Store

どう作ったか

Core Data + iCloud 同期

自分でサーバの管理のことを一切気にしなくていいしお金も払わなくていいという真のサーバレスは、 Apple プラットフォームの Core Data / SwiftData の iCloud 同期だけだと思っています(他にあったら教えてほしい)。もちろんユーザ間でデータを共有したいとなると独自のサーバを建てることになるのですが、同一ユーザの複数端末間でデータを共有したいだけなら iCloud 同期でことたります。このアプリでも Todo の一覧や実施状況を iCloud 同期するようにして、複数端末から利用できるようになっています。 最初は SwiftData で作っていて SwiftData 最高〜と思っていたのですが、なぜかアプリが複雑になるとともに動作が重くなってしまい謎のワークアラウンド(クエリ側じゃなくてアプリ側でフィルタしたり...)を入れてなんとかしていたのですが、限界に達して Core Data に置き換えたらいきなり動作がめちゃくちゃ軽くなってすべての問題が解決するということが起きたので Core Data を使っています。以前にも同じことがあったので SwiftData の実装に何か問題がありそうな気がしていますが深く追っておらず、早く誰かなんとかしてほしい。

Xcode Preview

iOS アプリを SwiftPM マルチモジュール構成で作るのが好きなので、いつも個人開発する時はメリット・デメリットなどを一切考慮せずとりあえず SwiftPM マルチモジュール構成にしているのですが、今回はあまりにも小さいアプリなので Xcode Project + Embedded Framework で開発してみました。本当は Framework も作りたくなくてアプリケーションターゲット1つで済ませたかったのですが、 Widget 対応をしたかったのでアプリと Widget のコード共有のためにしょうがなく Framework を導入しています。

それで気がついたのは、 Xcode Preview がたいへん便利だということです。 SwiftPM 構成だと Scheme によって Package 内のプレビューがビルドできなかったりするのですが、 Xcode Project にすべてのコードが入っていると Scheme の切り替えもいらないし、プレビューも安定して早くて体験がよかったです。もちろんアプリが大きくなってくると逆にプレビューをまともに動かすためにモジュール分割が必要になってきたりするのですが...。 とくに Core Data を使っているようなアプリだと、任意の状態を作るためにシミュレータを立ち上げてレコードを登録して...というのが面倒です。たとえば Todo を編集や削除することの動作確認のために毎回 Todo を追加しないといけないのではやっていられません。そんなときにコードから任意の状態を作れるし、実行し直すたびに初期状態に戻せるかつ実行も速い Xcode Preview が重宝しました。

さいごに

ちょっと前に以下の記事を書いたのですが、本文の流れも内容もそもそものやっていること自体もこの記事にそっくりでした。

これからは RSS の時代かと思って iOS / macOS で動く RSS リーダーを作った - maiyama4's blog

習慣化はできないのに、放っておくと同じようなことばかり繰り返してしまう...人間の業を感じますね。