← All Projects

デイリーリワードAPP(Daily Rewards APP)

日本の日替わりポイント・クーポン情報を集約するモバイルアプリ。

Flutter Dart Firebase Firestore Firebase Auth Cloud Functions Provider
Category
モバイル
Development Period
3週間
Responsibilities
企画 / 設計 / フロントエンド / バックエンド / DB設計 / セキュリティルール / デプロイ

概要

Flutter + Firebase で構築した習慣養成型の積分管理アプリ。毎日のサインインで積分を獲得し、連続日数に応じて倍率が上がる仕組みで継続利用を促す。積分は商品と交換でき、履歴管理やプッシュ通知設定にも対応する。単一コードベースでWeb・Android・Windowsに対応する。

対象ユーザー

  • 毎日の習慣づけをゲーム感覚で続けたいユーザー
  • 積分ベースのインセンティブ設計を導入したい事業者
  • Flutter + Firebase を活用したモバイルアプリの構築例を確認したいエンジニア

Demo / GitHub

🔗 デモを見る | GitHub

スクリーンショット

ホーム画面
ホーム画面 — ポイント残高・連続日数・サインインボタン・週間カレンダー
サインイン完了
サインイン完了 — ポイント獲得アニメーション・連続日数表示
商品詳細
商品詳細 — ポイント交換・在庫状況・保有ポイント表示
交換履歴
交換履歴 — ステータス進捗バー・交換日時・ポイント消費記録

開発背景

Flutter + Firebase を用いたクロスプラットフォームアプリ開発の実践として、認証・ポイント管理・商品交換までを備えたアプリを企画・設計・実装した。

解決した課題

  • 1つのコードベースでWeb・Android・Windowsの3プラットフォームに対応し、個別開発のコストを削減
  • 連続ログイン日数に応じた倍率ボーナスにより継続利用を促進
  • Firebase のセキュリティルールでユーザーごとのデータアクセス制御を実装し、他ユーザーのデータが閲覧・変更できない設計
  • 積分の加算・消費・商品在庫の更新をFirestoreトランザクションで整合性を保証

主な機能

  • ユーザー登録・ログイン(メール+パスワード認証)
  • 毎日サインイン(連続ログインボーナス、週間カレンダー表示)
  • ポイント管理(獲得・消費・残高表示)
  • 商品一覧・交換機能(在庫管理付き)
  • サインイン履歴・交換履歴
  • プッシュ通知設定
  • サインイン成功アニメーション(スケール+フェード+カウントアップ)

使用技術

  • フロントエンド: Flutter (Dart)
  • バックエンド: Firebase(Authentication / Firestore / Cloud Functions for Firebase)
  • 状態管理: Provider (ChangeNotifier)
  • デプロイ: Firebase Hosting
  • ビルド: Android APK / Web / Windows対応

設計上の工夫

  • Provider パターンによる状態管理: UserProvider に認証・サインイン・積分・交換のロジックを集約し、各画面はUIに専念する構成。Firebase とのデータアクセスを Provider 層へ集約し、UIとデータアクセスを分離することで保守性と拡張性を高めた
  • Firestore セキュリティルール: ユーザーは自身のデータのみ読み書き可能、商品は全ユーザーに読み取り専用で在庫フィールドのみ更新可能、という最小権限の原則を適用
  • シードデータの自動投入: 初回ログイン時にデモ商品を自動登録し、初期セットアップなしで即座に全機能を体験できる仕組み
  • Firestoreトランザクション: ポイント加算・商品在庫更新・交換履歴作成を1つのトランザクションとして実行し、途中失敗時もデータ不整合が発生しないようにした
  • IndexedStack による画面状態保持: 画面切替時に各タブの状態を保持し、一覧の検索条件やスクロール位置が失われない
  • レスポンシブUI: Web・Android・Windowsで同じコードベースを利用しながら、画面サイズに応じてレイアウトを切り替える設計とした

アーキテクチャ

[ユーザー] ブラウザ / Android / Windows
    ↓
Flutter アプリ(Dart)
├─ Screens(Splash, Auth, Home, History, Products, Redemptions, Settings)
├─ Providers(UserProvider: 状態管理)
├─ Models(User, Product, Redemption, PointTransaction)
└─ Services(AuthService, DatabaseService)
    ↓
Firebase
├─ Authentication(メール認証)
├─ Firestore(users, signIns, products, redemptions)
├─ Cloud Functions for Firebase(定時処理)
└─ Hosting(Web版デプロイ)

開発周期

3週間

担当範囲

企画 / 設計 / フロントエンド / バックエンド / DB設計 / セキュリティルール / デプロイ

成果・実現したこと

  • 認証・ポイント管理・商品交換・履歴管理を備えたフル機能アプリを開発し、Firebase Hosting でWeb版を公開
  • Flutterの単一コードベースでWeb・Android・Windowsの3プラットフォーム対応を実現
  • Firestore セキュリティルールによるユーザーデータ保護を実装し、本番運用可能な水準を達成

想定導入効果

  • 連続ログインボーナスによる継続利用率の向上
  • ポイント制度と連続ログインボーナスによるユーザーエンゲージメント向上
  • クロスプラットフォーム対応による開発・保守コスト削減

開発で直面した課題と解決方法

  • Firestore パーミッションエラー: シードデータの投入がログイン前に実行され、セキュリティルールでブロックされた。ログイン後にシード処理を移動して解決
  • 週間カレンダーの表示不整合: 連続日数からの推定表示ではなく、Firestore の実際のサインイン記録を参照する方式に変更
  • 交換後のUI無応答: ダイアログの context が pop 後に無効化される問題を、親 context で SnackBar を表示する方式で解決
  • Firestore 複合クエリのインデックス: where + orderBy の複合クエリにインデックスが必要だったため、クライアント側ソートに変更して対応

このプロジェクトで学んだこと

  • Flutter の Widget ツリーと Provider による状態管理の設計を実践し、画面数が増えても見通しの良い構成を維持する方法を身につけた
  • Firebase を BaaS として活用することで、サーバー構築なしで認証・DB・ホスティングを統合する開発フローを経験した
  • Firestore Security Rulesの設計を通じて、NoSQL環境における認可設計とデータアクセス制御の考え方を学んだ