
Створення продакшн-рекордера аудіо з Expo та React Native
Mobile audio recording is a core feature in many modern apps, powering everything from voice memos to podcast tools and user-generated content platforms. If you’re developing a mobile app with React Native, the Expo framework provides a robust set of APIs—especially the expo-av module—that simplifies cross-platform audio capture. But moving from a basic demo to a reliable, production-ready audio recorder means addressing a host of real-world challenges: managing permissions, supporting background recording, handling file storage, and reliably uploading recordings.
Let’s explore how to build a production-grade audio recorder using Expo and React Native, focusing on background recording, file management, and upload strategies. Along the way, you’ll find practical code examples and architectural tips for scalable, maintainable implementations.
Встановлення Expo AV для аудіозапису
Основа для будь-якого аудіоприложення на React Native — пакет expo-av. Ця бібліотека абстрагує платформенні деталі та надає уніфований API для відтворення та запису аудіо.
Спочатку переконайтесь, що у вас є потрібні залежності:
expo install expo-av
Вам також потрібно обробляти дозволи на доступ до мікрофона. Для iOS оновіть файл app.json відповідним описом використання:
“expo”: {
“ios”: {
“infoPlist”: {
“NSMicrophoneUsageDescription”: “We need access to your microphone to record audio.”
}
}
}
Для Android Expo автоматично управляє дозволами, але ви можете налаштувати повідомлення у AndroidManifest.xml, якщо викидаєте з проекту.
Запит дозволів
Перед початком запису завжди запитуйте дозвіл користувача:
import { Audio } from ‘expo-av’;
async function requestAudioPermission() {
const { status } = await Audio.requestPermissionsAsync();
if (status !== ‘granted’) {
throw new Error(‘Microphone permission not granted’);
}
}
Імплементування рекордера
API Audio.Recording — це ваша точка входу для захоплення аудіо. Ось базовий хуку для інкапсуляції логіки запису:
import { useRef, useState } from ‘react’;
import { Audio, AVPlaybackStatus } from ‘expo-av’;
export function useAudioRecorder() {
const [isRecording, setIsRecording] = useState(false);
const [recordingUri, setRecordingUri] = useState
const recordingRef = useRef
async function startRecording() {
await requestAudioPermission();
await Audio.setAudioModeAsync({
allowsRecordingIOS: true,
playsInSilentModeIOS: true,
staysActiveInBackground: true, // критично для фонового запису
});
const recording = new Audio.Recording();
await recording.prepareToRecordAsync(
Audio.RECORDING_OPTIONS_PRESET_HIGH_QUALITY
);
await recording.startAsync();
recordingRef.current = recording;
setIsRecording(true);
}
async function stopRecording() {
const recording = recordingRef.current;
if (!recording) return;
await recording.stopAndUnloadAsync();
const uri = recording.getURI();
setRecordingUri(uri);
setIsRecording(false);
recordingRef.current = null;
return uri;
}
return {
isRecording,
recordingUri,
startRecording,
stopRecording,
};
}
Інтеграція з UI
Проста UI-запис може виглядати так:
import React from ‘react’;
import { Button, View, Text } from ‘react-native’;
import { useAudioRecorder } from ‘./useAudioRecorder’;
export default function AudioRecorderScreen() {
const { isRecording, recordingUri, startRecording, stopRecording } = useAudioRecorder();
return (
{recordingUri && (
)}
);
}
Підтримка фонового запису
Одна з обмежень управляемих Expo-проєктів — справжній фоновий запис (коли застосунок повністю у фоновому режимі) може бути обмеженим, особливо на iOS. Проте, встановивши staysActiveInBackground: true в Audio.setAudioModeAsync, ви максимізуєте шанси на продовження запису, якщо користувач тимчасово перейде до іншого застосунку.
Для застосунків, що потребують надійного фонового запису (наприклад, запис телефонних розмов, тривалі інтерв’ю), розгляньте:
– Екзит до Expo Bare workflow: дозволяє використовувати нативні модулі або сторонні бібліотеки з більш глибокою підтримкою фону, наприклад react-native-audio-recorder-player.
– Мінімізація переривань: навчайте користувачів залишати застосунок у передньому плані для безперервного запису.
– Обробка переривань: слухайте події стану застосунку та акуратно зупиняйте або ставте на паузу запис, якщо застосунок переходить у фоновий режим понад те, що дозволяє ОС.
import AppState from ‘react-native’;
useEffect(() => {
const subscription = AppState.addEventListener(‘change’, (nextAppState) => {
if (nextAppState.match(/inactive|background/)) {
// За потреби зупинити або поставити на паузу запис
}
});
return () => subscription.remove();
}, []);
Управління файлами та зберіганням
Після запису аудіофайл зберігається на пристрої, зазвичай у тимчасовій локації. Для продакшн-застосунків варто розглянути:
– Переміщення файлів у постійне зберігання: використовуйте FileSystem.moveAsync з expo-file-system.
– Унікальні імена файлів: генеруйте файли із унікальним, часовим штампом, щоб уникнути колізій.
– Очистка: додавайте механізми видалення або архівування старих файлів для економії простору.
Приклад переміщення файлу до каталогу документів застосунку з унікальним ім’ям:
import * as FileSystem from ‘expo-file-system’;
async function moveRecordingToDocuments(uri: string): Promise
const fileName = `recording_${Date.now()}.m4a`;
const newPath = FileSystem.documentDirectory + fileName;
await FileSystem.moveAsync({ from: uri, to: newPath });
return newPath;
}
Використання аудіофайлів: завантаження на сервер
Завантаження аудіо на сервер — поширений наступний крок. Є кілька патернів для забезпечення надійності.
Проста пряме завантаження
Для коротких записів та стабільних мереж завантажуйте одразу після завершення запису:
async function uploadAudioFile(uri: string) {
const fileInfo = await FileSystem.getInfoAsync(uri);
const formData = new FormData();
formData.append(
‘file’,
{
uri,
name: ‘audio.m4a’,
type: ‘audio/m4a’,
} as any
);
await fetch(‘https://your-api/upload’, {
method: ‘POST’,
body: formData,
headers: {
‘Content-Type’: ‘multipart/form-data’,
},
});
}
Обробка офлайн та фонових завантажень
Для надійних застосунків реалізуйте черги завантажень та повторні спроби:
– Черги завантажень: зберігайте список очікуючих завантажень у локальному сховищі.
– Повторні спроби завантажень: використовуйте бібліотеки на кшталт react-native-background-upload у Bare workflow або реалізуйте свої фонові завдання.
– Зворотна зв’язок з користувачем: показуйте прогрес завантаження та повідомлення про помилки.
Безпека та приватність
– Шифрування файлів перед завантаженням, якщо дані чутливі.
– Отримання згоди перед записом або завантаженням аудіо.
Аудіовідтворення для перегляду
Дозвольте користувачам переглянути свої записи перед завантаженням — корисна UX-фічка. expo-av полегшує це:
async function playRecording(uri: string) {
const { sound } = await Audio.Sound.createAsync({ uri });
await sound.playAsync();
}
Інтегруйте плеєр у UI для зручного досвіду.
Тестування та крайні випадки
Продакшн-рекордерам потрібно обробляти:
– Перерваний запис (вхідні дзвінки, фоновий режим)
– Короткі, порожні або тиші
– Обмеження збереження
– Нетерпіння мережі під час завантаження
– Скасування дозволів
Автоматизуйте тестування за допомогою Jest та Detox, реєструйте помилки для діагностики.
Альтернативні бібліотеки та робочі потоки
Хоча управління Expo та expo-av достатні для багатьох випадків використання, розгляньте альтернативи, якщо потрібні:
– Розширене фонове записування
– Нестандартні формати аудіо
– Низькорівневе оброблення аудіо
Альтернативи включають:
– react-native-audio-recorder-player (bare workflow, більший контроль)
– react-native-sound
– користувацькі нативні модулі
Вибирайте залежно від вимог застосунку та готовності до нативної конфігурації.
Ключові висновки
Створення надійного, зручного для користувача аудіорекордера з Expo та React Native можливе за умови уважної уваги до деталей, що виходять за межі простого запису. Використовуйте expo-av для швидкої розробки, але плануйте під потреби продакшну:
– Завжди управляйте дозволами та проінформуйте користувачів.
– Використовуйте staysActiveInBackground для найкращої підтримки фону.
– Організуйте файли для довготривалого зберігання та легкого керування.
– Реалізуйте надійні шаблони завантаження, особливо для нестабільних мереж.
– Обробляйте крайні випадки з гідністю.
– Оцінюйте альтернативні бібліотеки, якщо потрібна глибша підтримка фону чи формати.
З такими паттернами ви зможете надати відшліфований, готовий до продакшну мобільний аудіоплеєр — чи то голосові замітки, інтерв’ю, чи інструменти для творчого аудіо.
HI-FI News
via DEV Community: javascript https://ift.tt/r0C1PI6
February 22, 2026 at 09:57AM
February 22, 2026 at 09:57AM

Залишити відповідь
Щоб відправити коментар вам необхідно авторизуватись.