### #プロジェクト経験概要
モダンなミュージアム向けに、Flutterを用いた館内ガイドアプリを0から開発しました。
2名のアプリエンジニア体制で、僕はBluetooth Beaconを利用した館内ナビゲーション、外部ベンダー製SDKのiOS / Androidネイティブ連携、音声ガイド、画像・動画・音声などのマルチメディア表示、多言語対応、Universal Links、アニメーション実装、テスト、リリース後の品質改善などを担当しました。
アプリは5言語・1,000件以上の展示物に対応し、約6か月という期間で新規開発からクライアントへのリリースまで実施しました。
リリース後も実際の来館者が利用する環境で継続して保守・改善を行い、Firebase Crashlyticsを利用したクラッシュ監視や警告の調査・修正にも取り組みました。
---
### #チーム情報
・アプリエンジニア:2名
・FlutterによるiOS / Androidアプリ開発
僕は主に以下の領域を担当しました。
・Bluetooth Beaconを利用した館内ナビゲーション
・外部ベンダー製の屋内測位SDKのiOS / Android統合
・Flutterとネイティブ間のMethodChannel設計・実装
・音声ガイド機能
・画像 / 動画 / 音声などのマルチメディア機能
・展示物のコレクション・館内ルート生成機能
・5言語への多言語対応
・Universal Links / Deep Links
・Flutterアプリ内のアニメーション・UX改善
・Golden Test / Widget Test / Unit Test
・Firebase Crashlyticsを利用したリリース後の監視・改善
担当機能について、技術調査、設計、実装、テスト、不具合修正、リリース後の保守まで一貫して担当しました。
また、屋内測位SDKについては外部ベンダーとのミーティングにも参加し、SDKの仕様や実装方法を確認しながら、iOS / Android双方への組み込みを自分で行いました。
---
## #開発・実装内容A
### 【概要】
Bluetooth Beaconと外部SDKを利用した館内ナビゲーション機能の開発
### 【どのような機能の開発・実装か】
Bluetooth Beaconを利用して館内にいるユーザーの位置を取得し、アプリ内のマップ上に現在地を表示する屋内ナビゲーション機能を実装しました。
ユーザーは1,000件以上の展示物から目的の展示物をマップ上で確認でき、興味のある展示物をコレクションへ追加できます。
さらに、そのコレクションをもとに館内を巡るルートを生成し、マップ上で案内できる機能を実装しました。
### 【課題・問題点】
GPSを利用できない屋内環境で高精度な位置情報を扱う必要があり、一般的な位置情報APIだけでは実現できませんでした。
屋内測位には外部ベンダーが提供するクローズドソースSDKを使用しましたが、Flutter向けSDKが存在せず、iOS / AndroidそれぞれでネイティブSDKを直接組み込む必要がありました。
SDKの仕様について不明点もあったため、ベンダーとの調整も必要でした。
### 【打ち手・使用した技術】
・SDK提供ベンダーとのミーティングを実施し、仕様・実装方法を確認
・iOS側ではXcode上でFrameworkのLinkingや各種設定を実施
・Android側でもネイティブSDKを直接導入
・iOS / Android双方のネイティブ連携を自分で担当
・MethodChannelを利用してSwift / KotlinとFlutterを接続
・取得した位置情報をFlutter側のマップ・BLoCへ連携
・展示物の位置情報と現在地を利用した館内ナビゲーションを実現
### 【成果】
Flutter向けSDKが存在しない環境でも、iOS / Android両方のネイティブSDKをFlutterから統一的に扱える仕組みを構築しました。
これにより、GPSを利用できない館内でも現在地を表示し、1,000件以上の展示物を対象とした館内ナビゲーションを提供できるようになりました。
---
## #開発・実装内容B
### 【概要】
音声ガイド・マルチメディア機能の開発
### 【どのような機能の開発・実装か】
展示物ごとに、テキストだけでなく画像・動画・音声を利用したガイドコンテンツを閲覧できる機能を実装しました。
音声ガイドでは通常のスピーカー再生に加えて、イヤホン利用時の再生や、端末を耳元へ近づけた際にレシーバーから音声を再生する機能も実装しました。
### 【課題・問題点】
画像・動画・音声など異なる形式のメディアを同一アプリ内で扱う必要がありました。
特に音声ガイドでは、イヤホン接続状態や端末の状態に応じて音声出力先を適切に変更する必要がありました。
### 【打ち手・使用した技術】
・Firebase Storageを利用したメディア管理
・画像 / 動画 / 音声それぞれの表示・再生UIをFlutterで実装
・Proximity Sensorを利用して端末を耳元へ近づけた状態を検知
・スピーカー / イヤホン / レシーバーの音声出力切り替え
・BLoCを利用したメディア再生状態の管理
### 【成果】
ユーザーがイヤホンを装着している場合、通常のスピーカーを利用する場合、端末を耳元に近づける場合など、利用シーンに応じて自然に音声ガイドを利用できるUXを実現しました。
また、展示物ごとに画像・動画・音声を組み合わせたリッチなガイドコンテンツを提供できる基盤を構築しました。
---
## #開発・実装内容C
### 【概要】
1,000件以上の展示物を対象としたコレクション・ルート生成機能
### 【どのような機能の開発・実装か】
ユーザーが興味のある展示物をコレクションへ追加し、選択した展示物を巡るためのルートを生成できる機能を実装しました。
生成されたルートは館内マップ上に表示され、現在地と組み合わせて利用できます。
### 【課題・問題点】
1,000件以上の展示物データを扱いながら、ユーザーが選択した複数の展示物、現在地、館内マップの状態を組み合わせて管理する必要がありました。
### 【打ち手・使用した技術】
・展示物データと館内マップ上の位置情報を紐付け
・ユーザーごとのコレクション機能を実装
・選択された展示物をもとにした館内ルート生成
・BLoCによるコレクション・マップ・ルート状態の管理
・Firebaseを利用した展示物データ管理
### 【成果】
単に展示物一覧を閲覧するだけではなく、ユーザー自身が「見たい展示」を選択し、その内容に応じて館内を回れるパーソナライズされた鑑賞体験を実現しました。
---
## #開発・実装内容D
### 【概要】
5言語に対応した国際ユーザー向け多言語対応
### 【どのような機能の開発・実装か】
海外からの来館者も利用することを想定し、アプリ全体を5言語に対応しました。
UIテキストだけでなく、1,000件以上の展示物のタイトル・説明・音声・動画などのコンテンツについても、選択された言語に応じて切り替えられるようにしました。
### 【課題・問題点】
静的なUIだけではなく、Firebaseから取得する展示物情報やFirebase Storage上のメディアコンテンツまで多言語化する必要がありました。
言語変更時には、テキストだけでなく表示中の展示情報・音声・動画なども同じ言語へ切り替える必要がありました。
### 【打ち手・使用した技術】
・FlutterのLocalization機構を利用したUIの多言語対応
・5言語分の展示コンテンツを管理できるデータ構造を構築
・Firebase / Firebase Storage上の言語別コンテンツとの連携
・BLoCを利用した言語状態管理
・言語変更に合わせた画面・コンテンツの動的更新
### 【成果】
5言語・1,000件以上の展示物に対応し、国内利用者だけでなく海外からの来館者も同じアプリから展示情報や音声・動画ガイドを利用できる仕組みを実現しました。
---
## #開発・実装内容E
### 【概要】
ミュージアムのブランド体験に合わせたUI / UX改善
### 【どのような機能の開発・実装か】
施設自体がモダンなデザインを特徴としていたため、アプリについても単純な業務アプリのような見た目ではなく、施設の体験に合ったモダンなUIになるようアニメーションを追加しました。
画面遷移やコンテンツ表示などにアニメーションを取り入れ、操作時のフィードバックや視覚的な質感を改善しました。
### 【課題・問題点】
館内体験の一部として利用されるアプリのため、機能的に利用できるだけではなく、実際の施設のデザイン・ブランドイメージと違和感のない体験を提供する必要がありました。
### 【打ち手・使用した技術】
・Flutter Animationを利用したUIアニメーション
・画面遷移や状態変化に合わせたアニメーションの追加
・機能性を損なわない範囲でインタラクションを改善
・施設のモダンな空間に合わせたアプリ体験を意識して実装
### 【成果】
館内施設のモダンな雰囲気とアプリの体験を合わせ、単なる情報閲覧ツールではなく、施設体験の一部として自然に利用できるUIを目指しました。
---
## #開発・実装内容F
### 【概要】
テスト・品質管理およびリリース後の継続改善
### 【どのような機能の開発・実装か】
6か月という限られた期間で0からアプリを開発し、クライアントへリリースする必要があったため、開発と並行して自動テストやリリース後の監視環境も整備しました。
### 【課題・問題点】
実際の来館者が利用するアプリのため、開発環境で正常に動くだけではなく、さまざまな端末・利用状況で安定して動作する必要がありました。
また、位置情報・センサー・動画・音声・ネイティブSDKなど端末依存性の高い機能が多く、不具合が発生した場合に原因を追跡できる仕組みも必要でした。
### 【打ち手・使用した技術】
・Unit Testを実装
・Widget Testを実装
・Golden TestによるUI差分の検知
・Firebase Crashlyticsを導入
・リリース後のクラッシュ・警告を継続的に監視
・Crashlytics上で発生した問題を調査し、不具合や警告を改善
・実ユーザー利用開始後も継続して保守・改善
### 【成果】
2名のアプリエンジニア体制で、約6か月で0からクライアント向けアプリをリリースしました。
リリース後もCrashlyticsを用いて実際のユーザー環境で発生するクラッシュや警告を監視し、問題を発見・修正する運用を継続しました。
Golden Test / Widget Test / Unit Testも導入することで、機能追加や保守時の品質を担保しやすい開発環境を構築しました。