前回の続きでバックエンド(【Remote Config】【Analytics】【App Hosting】)の実装を今回は行っていきます。
この機能の説明については以下の記事をご覧ください。

始めに:
記事のメインとなるのは、【Remote Config】と【Analytics】です。
【App Hosting】は必要なファイルの作成のみです。セクション6の公開(デプロイ)にて実装の記事を発信していきます。
今回のやりたいこと:
今回の記事では、以下を行っていきたいと思っています。
- Analytics を導入し、利用状況を計測できるようにする
- Remote Config を使い、UIの一部を動的に変更できるようにする
- Firebase App Hosting にデプロイするための準備を整える
記事の流れは、準備→プロンプト依頼(実装)→確認です。
ではご覧ください。
【準備編】バックエンド実装前の前準備
① Analytics の有効化
- Firebaseプロジェクトコンソール「設定」→「統合」のクリック。
- Analyticsの「有効」を確認する。
- なっていない場合は、「有効化」をクリック。

② Remote Config のパラメータ値の作成
今回のメインとなる【Remote Config】のパラメータ値(キーとバリュー)を準備していきます。
- 左メニュー Build (構築) → Remote Config をクリック。
- 「構成を作成 (Create configuration)」ボタンをクリック。
- パラメータを追加
- パラメータキー: 例:
zen_background_url - データ型: 文字列 (String)
- デフォルト値: (新しい画像URLなど、今の画像とは違うものを入れる)
- 「保存」を押す。
- パラメータキー: 例:
- 右上の 「変更を公開 (Publish changes)」 を必ず押す。
- パラメータ値が作成されたか確認する。


今回使用した画像は、「Beautiful Free Images & Pictures | Unsplash」です。このサイトは、世界で最も寛大な貢献者コミュニティが提供する600万枚以上の無料高解像度写真とイラストを自由に使うことができます。
特にBeautiful Free Images & Pictures | Unsplash は【English】利用を推奨します。【日本語】では、スラッグがURLパラメータのエンコード・デコード関係で文字化けするので、見た目が悪くなります。また、管理や技術的配慮の観点からもネガティブに捉えられてしまいます。

【実装フェーズ】バックエンドの実装をAIエージェントに依頼する

- 具体的な依頼内容(How)
-
① Remote Config の導入
- Zenモードの背景画像URLを
コードではなく Firebase Console から変更可能にしたい - 開発中は即時反映される設定も含めたい
② Google Analytics の導入
- Next.js(SSR環境)でエラーなく動く形で初期化したい
- アプリ起動時に一度だけ Analytics を有効化したい
③ App Hosting 用の準備
- Firebase App Hosting(Next.js対応)にデプロイする前提で
apphosting.yamlを用意したい - 環境変数を使う前提の構成も理解したい
- Zenモードの背景画像URLを
- 成果物として求めたもの(Output)
-
- Analytics / Remote Config を追加した
firebase.ts - 背景画像を動的に切り替える
Timer.tsxの修正点 apphosting.yamlの中身
- Analytics / Remote Config を追加した
【作成後の重要な項目】実際に動作するのか確認する。
② Analyticsの確認:シークレットタブを活用してテスト
開発中の画面でアプリを利用してもAnalyticsに反映されないので一度、外部のアクセス者として利用します。
始めの準備:開発中のアプリに外部アクセスできるようにする。
- Firebase Studioの開発中プロジェクトから有効化します。
- 【Prototypeモード】のブラウザの右上「リンクアイコン」をクリックする。
- メニューが開くので「Make Preview Public」をクリックして「有効化」。
- アイコンが変わったのを確認する。「リンク」→「ネットワーク」
- シークレットタブを作成する:検証ツール:Google Chrome
- Google Chromeから「新しいタブ」を開く。
- タブ右端にある「…」をクリック。
- メニューが開くので「新しいシークレット ウィンドウ」をクリック
- 「シークレット ウィンドウ」タブが開きます。(これによって外部のアクセス者として検索が可能になります。)
- 検索してアプリを実行する
- 先程「有効化」したアイコンをもう一度クリックしてメニューを開く。
- 「Copy URL」をクリックしてリンクをコピーする。
- 「シークレット ウィンドウ」タブのアドレスバーにコピーしたURLをペースト(貼り付け)して検索。
- 開発中アプリにアクセスできれば成功。確認したら実行する。
- 自身のFirebaseプロジェクトに戻って「Realtime Analytics」を見る。(左メニューの「分析」項目から選択可)
- 実際に「1」がカウントされたら成功。

Remote Configの確認:利用して画像が切り替われば成功!
Remote Configでの確認項目は、実際に利用した時に準備で設定したパラメータ値に変われば成功です。(今回は、背景画像のため背景画像が変わればOK!)

問題と原因:実際に利用した時に起こった事。
検証結果での問題と最終的にわかった原因をここで発表します。
問題:背景画像が表示されていない。
原因:パラメータ値設定でのバリュー(Value):画像のURLとサイトのURLの違い。たったこれだけ。
一見同じURLのように見えますがここが違うだけで思うような画像を表示できなくなります。
これからその原因を特定に至った方法と確実に画像URLを取得する方法をお伝えしていきます。
行ったテスト方法:3段階(A→B→A+B)で地道に調査
テストを行う前に確認したこと
- Remote Config のフェッチキャッシュは、デフォルトでは「12時間」変更を読みに行きません。(通信節約のため)
- ファイル先頭に
"use client";があるか見る。- Next.js App Router では、Remote Config はブラウザ(クライアント)でしか動きません。
- Firebase Console の Remote Config 画面右上を見る「変更を公開 (Publish changes)」したか?
- 取得したURLの画像サイズやサイトの仕様によって、正しく表示されない事も。CSSは設定されているか?
テストの手順
- /publicの画像のみで背景を表示させる。(そもそも背景画像が表示できていたのか?)
- RemoteConfigのみで背景を管理する。(/publicの画像は使わない)
- 統合テスト:両方を実装する。
- Remote Configを第一優先:まず、Firebase Remote Configから値を取得しにいきます。
- 確実なフォールバック:値の取得に失敗した場合(キーが存在しない、値が空、通信エラー)は/public画像を表示させる。
これらの内容を基に画像URLとサイトURLの値が違うと推測しました。
画像URLの取得を行い、パラメータ値のバリュー(Value)にセットする事で改善されることになりました。
たったこれだけだったのですが、なかなか苦労する問題になりました。


正しい画像URLの取得手順
Unsplash の画像サイトを例に説明します。
方法 : 右クリックでコピー(一番確実)
これが「Webページ」ではなく「画像データ」の場所を知る基本テクニックです。
- ブラウザで、使いたい画像が表示されているページを開く。
- その画像の上で 右クリック する。
- メニューの中から以下のどれかを選ぶ(ブラウザによって言葉が少し違います)。
- Chrome: 「画像アドレスをコピー」 (Copy image address)
- Edge: 「画像リンクをコピー」
- Safari: 「イメージのアドレスをコピー」
- このコピーしたURLを Remote Config パラメータ値(Value)に貼り付けてください。

確認: 新しいタブで開いて確認(検証用)
検索で表示した時に、画面に画像だけがポツンと表示され、背景が黒やグレーになっている状態になったら問題なく表示される画像と判定できます。

まとめ
今回は、バックエンドの実装を行っていきました。
バックエンドの準備→AIエージェントに依頼→動作の確認→問題と解決の流れで記事にしていきました。
画像URLとサイトURLの違いで戸惑いましたが何とか実装を成功する事が出来ました。
見てくれている方もRemote Configで画像を実装する際は、今回の問題に気を付けて行ってください。
次回は、バックエンドの連携編です。実装した【Analytics】と【Remote Config】を連携させてA/Bテストができるようにしていく気になっています。ぜひお楽しみに!
ここまで読んでいただきありがとうございました。またお会いしましょう!Tomoyaでした。










コメント