Quiz 3 — Natif & animations (P9-P10)
20 questions · ~15 min
1. Le rituel des modules expo-* en 4 étapes (+ l’étape zéro) ?
Réponse
Vérifier la compat Expo Go (étape 0) → installer (expo install) → permissions (plugin + runtime) → config plugin si natif → utiliser.
2. Les trois états d’une permission, et la conduite pour « blocked » ?
Réponse
granted / denied-canAskAgain / blocked (canAskAgain: false) — pour blocked : proposer
Linking.openSettings(), ne JAMAIS re-prompter en boucle.
3. Quand demander une permission (la règle UX) ?
Réponse
Au moment du besoin, déclenchée par l’action qui l’explique (activer le rappel → boîte notifs) — jamais en rafale au premier lancement.
4. Notification locale vs push : laquelle exige un serveur, et laquelle utilise Drill ?
Réponse
Push = serveur + FCM (+ dev build). Locale = planifiée sur l’appareil (trigger DAILY) — le défi quotidien de Drill, zéro infra.
5. Pourquoi le canal Android est-il obligatoire, et que permet-il à l’utilisateur ?
Réponse
Depuis Android 8, chaque notif appartient à un canal déclaré — l’utilisateur règle/coupe chaque canal indépendamment dans les paramètres système.
6. Le tap sur une notification app TUÉE : quel mécanisme le rattrape ?
Réponse
getLastNotificationResponseAsync() au démarrage — le listener n’existait pas au moment du
tap (pas de JS). Les deux mécanismes se câblent toujours ensemble.
7. La planification idempotente d’une notification récurrente ?
Réponse
Identifier FIXE + cancel avant schedule : N appels = UNE planification (l’anti notifications-en-double).
8. impactAsync vs notificationAsync (haptics) : la sémantique ?
Réponse
Impact = un contact (tap — Light/Medium/Heavy) ; notification = un verdict (Success/Warning/Error). Drill : Light au tap, Success/Error au résultat.
9. Pourquoi précharger les sons de jeu ?
Réponse
Charger au moment de jouer = 100-300 ms de latence — le feedback décalé est ruiné. Players globaux créés au démarrage + seekTo(0).
10. Le rôle architectural de lib/feedback.ts ?
Réponse
Des verbes métier (correct, wrong, newRecord) encapsulant haptics + sons + respect des réglages (getState) — la grammaire sensorielle en un seul fichier.
11. Share.share : quelle permission, et quel piège sur le retour ?
Réponse
Aucune (l’utilisateur choisit la destination). Piège : sharedAction ne garantit pas un envoi réel sur Android — pas de récompense dessus.
12. documentDirectory vs cacheDirectory ?
Réponse
documentDirectory = persistant (les données de l’app) ; cacheDirectory = purgeable par le système (exports temporaires, caches reconstructibles).
13. Pourquoi les animations pilotées en JS saccadent-elles ?
Réponse
Il faut une valeur par frame (16 ms à 60 Hz) et le thread JS fait AUSSI tourner l’app — toute occupation = frames ratées. Reanimated exécute sur le thread UI.
14. Qu’est-ce qu’un worklet ?
Réponse
Une fonction JS compilée pour s’exécuter sur le thread UI (styles animés, gestes) — d’où
runOnJS pour rappeler React depuis un worklet.
15. Modifier sharedValue.value re-rend-il le composant ?
Réponse
Non — c’est le principe : l’animation contourne React ; seuls les worklets qui lisent la valeur (useAnimatedStyle) réagissent, à 60-120 Hz.
16. timing vs spring : la règle de choix ?
Réponse
Quantités (progression, opacité) → timing (durée+easing). Objets à l’écran (boutons, cartes) → spring (physique, interruptible proprement).
17. L’anneau du timer : la technique SVG et le hook Reanimated ?
Réponse
strokeDasharray = circonférence, animer strokeDashoffset — via useAnimatedProps sur un
createAnimatedComponent(Circle) (+ interpolateColor pour le rouge des dernières
secondes).
18. UNE animation withTiming pour tout le timer plutôt que des ticks : pourquoi ?
Réponse
Le thread UI interpole chaque frame tout seul pour la durée donnée — fluidité parfaite, zéro trafic JS. La resync (progress = remaining/total AVANT le withTiming) garde l’anneau honnête après un arrière-plan.
19. Les trois temps d’un Gesture.Pan ?
Réponse
onBegin : mémoriser la position de départ · onChange : suivre (start + translation) · onEnd : décider (seuil → action, sinon spring retour avec la vélocité du doigt).
20. activeOffsetX([-10, 10]) sur un swipe d’item : que résout-il ?
Réponse
Le conflit geste/scroll : le Pan ne capture qu’après 10 px HORIZONTAUX — en deçà, la liste scrolle. (Et toute suppression au geste a son toast Annuler.)