fix(mobile): dictée validée sur iPhone physique — 2 bugs réels corrigés

setAudioModeAsync({allowsRecording:true}) manquant avant recorder.record()
(RecordingDisabledException iOS) ; EXPO_USE_PRECOMPILED_MODULES/
RCT_USE_PREBUILT_RNCORE jamais persistés dans .env (documentés dans ADR-005
mais seulement exportés en shell ad-hoc) — corrigé pour que tout rebuild
depuis zéro ne reproduise plus le crash dyld. Recette terrain complète
vérifiée : dictée → note → clôture → réindexation → recherche sémantique.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
pr-daaif
2026-08-01 22:09:04 +01:00
parent 59ed6f3952
commit 4af3f5668a
5 changed files with 68 additions and 5 deletions

View File

@@ -6,3 +6,11 @@
# boucle de retry silencieuse — trouvé en recette terrain iOS (17/07/2026).
# Voir ADR-005 et docs/journal/journal.md.
EXPO_PUBLIC_USE_RN_FETCH=1
# Modules Expo/RN précompilés (XCFrameworks, SDK 56/57) incompatibles avec la
# liaison statique de ce projet (pas de use_frameworks!) : sans ce réglage,
# l'app compile mais CRASHE au lancement
# (dyld: Library not loaded: @rpath/React.framework/React, signal 6).
# Force la recompilation depuis les sources — voir ADR-005.
EXPO_USE_PRECOMPILED_MODULES=0
RCT_USE_PREBUILT_RNCORE=0

View File

@@ -2,7 +2,12 @@ import * as FileSystem from 'expo-file-system';
import { router, useLocalSearchParams } from 'expo-router';
import { useState } from 'react';
import { Pressable, ScrollView, Text, TextInput, View } from 'react-native';
import { RecordingPresets, requestRecordingPermissionsAsync, useAudioRecorder } from 'expo-audio';
import {
RecordingPresets,
requestRecordingPermissionsAsync,
setAudioModeAsync,
useAudioRecorder,
} from 'expo-audio';
import { SafeAreaView } from 'react-native-safe-area-context';
import {
BILAN_FIELD_LABELS,
@@ -197,6 +202,9 @@ function CarteSuggestion({
const demarrerDictee = async () => {
const { granted } = await requestRecordingPermissionsAsync();
if (!granted) return;
// iOS refuse recorder.record() tant que la session audio n'a pas été
// explicitement autorisée à enregistrer (RecordingDisabledException).
await setAudioModeAsync({ allowsRecording: true, playsInSilentMode: true });
await recorder.prepareToRecordAsync();
recorder.record();
setEnregistrement(true);
@@ -205,6 +213,7 @@ function CarteSuggestion({
const terminerDictee = async () => {
await recorder.stop();
await setAudioModeAsync({ allowsRecording: false }); // n'arme le micro que le temps de dicter
setEnregistrement(false);
const uri = recorder.uri;
if (!uri) return;