Skip to Content
React Native20. QuizQuiz 3 — Natif & animations

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.)