メモパチのv1.2.2をリリースした。前バージョンからおよそ2か月。新機能はない。バグ修正、セキュリティ対応、Flutter本体のアップグレード、パッケージ更新が主な内容だ。

個人開発をしていると、こういうバージョンを出すのをためらうことがある。「新機能がないのにリリースするのか」という気持ちがどこかにある。でも今回やってみて、メンテナンス専用のリリースには、それ固有の意味があると感じた。その話も後半に書く。

// App Store — What's New

Version 1.2.2

改善

機種設定画面の並び替えを修正 — 並び替え後に順番がずれる問題を修正しました。
掲示板の返信通知を改善 — 通知の精度を向上しました。
セキュリティ強化 — 掲示板への画像アップロード処理を改善しました。
Flutter 3.44.0 対応 — フレームワークのアップグレードにより安定性が向上しました。
内部構造の改善 — 依存パッケージの更新・リファクタリングを実施しました。

修正 ①

並び替えバグ:deprecationを無視した代償。

機種設定画面でカスタム項目をドラッグで並び替えるとき、移動後の順番がずれるバグがあった。2番目の項目を一番上に移動すると、なぜか3番目に来る、といった挙動だ。ユーザーから見ると「並び替えたのに意図した順番にならない」という、地味にストレスのある不具合だった。

原因を掘ると、Flutter 3.41でリストの並び替えに使うonReorderが非推奨になっていた。後継のonReorderItemではフレームワーク側がインデックス補正を自動でやってくれるが、旧APIで必要だった手動補正のコードをそのまま残していたため、補正が二重にかかってずれていた。

deprecationの警告はビルド時に出ていたはずだが、動いているうちは後回しにしていた。Flutterのバージョンを上げたタイミングで症状が出て、ようやく向き合うことになった。「動いている警告は後でいい」が通じないのが、フレームワークのメジャーアップグレードだ。新APIに切り替えて手動補正コードを削除したら正常に動いた。

改善 ②

セキュリティ:掲示板の画像アップロードを見直した。

掲示板機能を実装したとき、画像のアップロード先となるStorageのパス設計を後回しにしていた部分があった。今回、セキュリティレビューの中で改めて見直し、アップロードパスにユーザーID(uid)を含める構造に変更した。

この構造にすることで、Firebase Storage Rulesで「自分のuidが含まれるパスにしか書き込めない」という制御がかけられる。一般掲示板・機種掲示板・店舗掲示板の3つすべてで同じパターンに統一した。Firestoreのセキュリティルールも合わせて見直し、投稿数カウンターの更新や通知の書き込みに対して、操作できるフィールドと条件を明示的に絞り込んだ。

こうした対応は地味で、ユーザーには一切見えない。でも掲示板機能のように不特定多数が書き込む仕組みは、設計の甘さが積み重なると後で取り返しがつかなくなる。機能を追加するときと同じくらい、ルールの整備に時間をかける必要がある。

なお今回はアプリのリリースに合わせてルールをデプロイした。旧バージョンのユーザーへの影響を考慮して、タイミングを調整している。

改善 ③

Flutter 3.44.0:アップグレードの判断軸。

Flutter 3.38.9 → 3.44.0、Dart 3.10.8 → 3.12.0にアップグレードした。合わせてhive_ce、uuid、image_picker、shared_preferencesなど主要パッケージも最新版に更新している。

結果として大きな破壊的変更はなく、flutter analyzeはNo issuesで通った。ただし毎回このくらいスムーズにいくとは限らない。Riverpod v3・Firebase SDK v4・AdMob v8はいずれもメジャーバージョンアップで破壊的変更が含まれるため、今回は見送っている。

個人開発でパッケージを上げる判断は難しい。「最新を追う」のが必ずしも正解ではなく、影響範囲を把握してから上げるのが基本になる。マイナーアップデートは積極的に取り込み、メジャーアップデートは別リリースで時間を取って対応する、という方針にしている。今後もこの判断軸は変えないつもりだ。

番外編

意図していなかった改善が、起きた。

以前この記事で、バナー広告が表示されなくなったと書いた。クリーンビルド、キャッシュ削除、Pod更新、再インストール、いろいろ試したが原因は特定できず、そのままになっていた。

今回のアップデートをビルドしてインストールしたところ、バナー広告が再び表示されるようになった。何が原因だったのかは今もわからない。

自分の環境ではテスト広告が表示される設定になっていて、テスト広告自体もともと動作が不安定らしい。Flutter・パッケージの更新、依存関係の再解決、署名のやり直し——アップデート作業にはこれだけの操作が含まれる。そのどれかが症状を消したのか、あるいは単純に時間が経って何かがリセットされたのか、いまだに判別できていない。

ただ、確かなことが一つある。あのまま放置していたら今も表示されていなかった、ということだ。

メンテナンスバージョンについて

「新機能がないリリースに意味はあるか」という問いへの自分なりの答えが今回出た。ある。バグは直らないまま残り、deprecation警告はいつかクラッシュになり、セキュリティの見直しは後回しになり、不明な不具合は放置され続ける。定期的にコードと向き合うこと自体が、アプリを動かし続けるための作業だ。新機能がない地味なバージョンでも、出す価値はある。