Museum Audio Guide Mobile App Development
Visitor takes phone, approaches exhibit — audio automatically starts. Or scans QR. Or enters number from label. Three scenarios, one screen — and everything should work offline because museum Wi-Fi is rarely reliable.
Automatic Exhibit Detection
Most interesting scenario — proximity trigger without user actions.
iBeacon / Bluetooth LE. Beacons at each exhibit (Estimote, Kontakt.io). iOS: CLLocationManager.startRangingBeacons(satisfying:) — get list of beacons with proximity (.immediate / .near / .far) and rssi. Select nearest with .immediate and start audio. Important: don't react to every proximity change — debounce 2-3 seconds, otherwise audio switches on random signal fluctuations.
Android: BluetoothLeScanner with filter by beacon manufacturer UUID. AltBeacon library simplifies ranging. Foreground Service needed for scanning in background — while app active, regular scanning sufficient.
QR scanning. Backup option. iOS: VNDetectBarcodesRequest (Vision) — faster than AVMetadataOutput for one-time scan. Android: ML Kit Barcode Scanning. Flutter: mobile_scanner.
Manual number entry. Always as fallback — if Bluetooth dead or no beacons.
Offline Content and Data Structure
Museum with 200 exhibits — 200 audio files, images and texts. Total 300-500 MB. Loading strategy:
- On first launch download "lightweight" package: texts, 200px previews, metadata (beacon UUIDs, exhibit numbers)
- Audio downloaded piecemeal or on-demand with caching
Storage structure: CoreData/Room for exhibit metadata (id, title, beacon_uuid, qr_code, languages). Audio files — in Application Support/filesDir with id → path mapping. SQLite query "find exhibit by beacon UUID" — instant.
Multilingual: user chooses language at start. Audio and texts stored with language suffix. Download only selected language — saves space.
Exhibit Audio Player
AVPlayer (iOS) / ExoPlayer Media3 (Android) / just_audio (Flutter). Specifics for audio guide:
- Auto-stop on moving away from exhibit (proximity returned to .far)
- Progress saved: return to exhibit — continues from pause
- Playback speed: 0.8x for elderly visitors, 1.5x for fast
- Lock screen controls via
MPNowPlayingInfoCenter(iOS) /MediaSession(Android)
Interactive Exposition Map
Map of halls with exhibit points. Not Google Maps — museum doesn't want external dependencies and payments. Use SVG map of halls: in app this is WKWebView with interactive SVG (iOS), WebView (Android) or flutter_svg with GestureDetector (Flutter).
Or native Canvas/CustomPainter implementation: load PNG map as background, draw exhibit points on top with scaling (pinch-to-zoom).
Current visitor location on map — via same iBeacon ranging: determine hall by set of visible beacons with strong signal. Not GPS — doesn't work indoors.
CMS for Museum Staff
Administrator updates texts and audio without app release. Backend: simple REST API + S3 for media files. App on launch checks version of manifest — if changed, download delta.
Timeline: app with QR scanning, offline content, audio player and hall map — 4-6 weeks. With iBeacon proximity and CMS — 7-9 weeks.







