今週はソーシャル機能の基盤を一気に作り、プッシュ通知まわりを全面的に整備しました。
募集のクローズ機能を作った
オーナーが手動で募集を締め切れるようにしました。クローズ時は相談中・応募中のユーザーを一括で見送りにして、各チャットに「この募集はクローズされました」というシステムメッセージを自動送信します。承認済み(マッチング成立済み)の人には影響しない設計です。
ソーシャル機能の基盤を一気に実装
フォロー・ブロック・評価・通報・お知らせの5機能を設計してまとめて実装しました。フォロワー数はFirestoreのFieldValue.incrementでアトミックに管理し、ブロックはお互いのコンテンツが見えなくなる「全ミュート」方式です。リリースに必要な機能が揃ってきました。
アバターをタップするとプロフィールが開くようにした
マップカードやチャット画面など、アバター画像が表示される場所ならどこからでもプロフィール画面をシートで開けるようにしました。相手のことを知りたいときに自然な操作でたどり着けます。
マップをリアルタイム化して、ピン消えバグも直した
新しい募集を作ってもマップに即時反映されなかった問題を修正しました。合わせてコードを読んでいたら
limit(to: 100) が残っていて、広範囲を表示すると101件目以降のピンが消える原因になっていたので削除しました。修正は1行でしたが、リアルタイム化のリファクタリングをして初めて気づけた感じです。
プッシュ通知にDMを追加してディープリンクも整備
DM通知を新たに追加し、通知をタップするとチャット画面まで直接飛べるようになりました。フォロー通知タップで相手のプロフィール画面が開くなど、通知ごとの遷移先を整備しています。アプリが完全終了した状態からの起動にも対応しました。
マイ釣行タブにソート機能を追加
参加予定の一覧を日付・ステータス・更新順で並び替えられるようにしました。案件が増えてくると一覧が見づらくなるので、自分の使い方に合わせて並べ替えられると便利です。
お問い合わせフォームをGoogle Formsで作った
アプリ内に「お問い合わせ」リンクを追加しました。Google FormsをWebViewで表示するシンプルな実装です。サポート窓口があるとリリースに向けた安心感が増しました。
通知をすべてCloud Functionsに移行してセキュリティを強化
評価通知だけクライアントから直接Firestoreに書き込む実装が残っていたので、他の通知と同様にCloud Functions経由に統一しました。合わせてFirestoreのセキュリティルールをCLI管理に移行し、クライアントからの通知直書きを完全に禁止しています。
通知設定画面を実装してトグルのバグも直した
通知の種類ごとにON/OFFを切り替えられる設定画面を追加しました。実装直後にトグルを押しても切り替わらないバグが発覚。原因はFirestoreのnilとSwiftUIのバインディングの組み合わせで、書き込み完了後にViewが古い値で再描画されるというものでした。デバッグに時間がかかりましたが、無事解消しています。
コメント