SDK React Native (Expo)

Le même hook que sur le web, sur iOS et Android. lunion_react-native s'appuie sur react-native-webrtc et le même protocole que le SDK web.

Le flux

Votre serveur émet un jeton avec @lunionlab/meet-server-sdk(voir « Jetons d'accès »). Votre app mobile reçoit url, room et token, puis rejoint avec useLunionRoom.

1. Installer

terminal
npx expo install @lunionlab/meet-react-native react-native-webrtc

Development build requis

react-native-webrtc contient du code natif : utilisez un development build (npx expo prebuild puis npx expo run:ios / run:android). Il ne fonctionne pas dans Expo Go.

Permissions (app.json)

app.json
{  "expo": {    "plugins": [      ["react-native-webrtc", {        "cameraPermission": "Pour les appels vidéo",        "microphonePermission": "Pour les appels audio"      }]    ]  }}

2. Récupérer un jeton (côté serveur)

Le jeton est émis par votre backend. Ne mettez jamais votre clé d'API dans l'app.

server.ts
import { RoomServiceClient } from "@lunionlab/meet-server-sdk"; const rooms = new RoomServiceClient(  "https://meet.lunion-lab.com/api/v1",  process.env.LUNION_API_KEY!,); const room = await rooms.createRoom("Réunion produit");const access = await rooms.createToken(room.slug, "user-42", { name: "Awa" });// → renvoyez access.url, access.room, access.token à votre app mobile

3. Rejoindre la salle

Le hook useLunionRoom gère la connexion, la caméra/micro et les participants. Affichez chaque flux avec le composant VideoTrack.

CallScreen.tsx
import { View } from "react-native";import { useLunionRoom, VideoTrack } from "@lunionlab/meet-react-native"; export function CallScreen({ url, room, token }: { url: string; room: string; token: string }) {  const { localStream, participants, toggleMic, toggleCamera, leave } = useLunionRoom({    sfuUrl: url,    room,    name: "Awa",    token,  });   return (    <View style={{ flex: 1, flexDirection: "row", flexWrap: "wrap" }}>      <VideoTrack stream={localStream} mirror style={{ width: "50%", aspectRatio: 3 / 4 }} />      {participants.map((p) => (        <VideoTrack key={p.id} stream={p.stream} style={{ width: "50%", aspectRatio: 3 / 4 }} />      ))}    </View>  );}

Contrôles

  • toggleMic() / toggleCamera() : couper ou activer le micro et la caméra.
  • switchCamera() : basculer entre caméra avant et arrière.
  • status : idle · connecting · waiting · connected · reconnecting · error.
  • leave() : quitter et libérer la caméra et le micro.

Fonctionnalités avancées

Toutes optionnelles et rétro-compatibles (options de useLunionRoom, ou contrôle bas niveau via LunionMeetClient).

  • Reconnexion réseau automatique (option reconnect, activée par défaut) : bascule 4G↔wifi, mise en arrière-plan, perte de porteuse. Le statut passe à reconnecting puis connected, le flux local est re-publié.
  • Réception de la modération: la coupure décidée par l'hôte est appliquée localement (micro/caméra). Option autoApplyModeration (défaut true) + callback onModerated(op)pour l'afficher.
  • Mode récepteur pur (receiveOnly) : rejoint sans publier — mur d'images, spectateur, écran de projection.
  • Partage d'écran : shareScreen() / stopScreenShare() / isScreenSharing / screenStream (aperçu local, à passer à un RTCView). L'arrêt depuis la notification Android ou la fin du broadcast iOS met l'état à jour automatiquement. Prérequis natifs obligatoires (Android MediaProjection + service au premier plan ; iOS Broadcast Upload Extension + App Group) — sans eux shareScreen() échoue au runtime : guide de configuration native.
  • Modération & présence : isHost, admit/deny/moderate/setRole/transferHost, locuteur actif (activeSpeaker + onActiveSpeaker), enregistrement (startRecording/stopRecording + onRecordingStatus).
  • Scalabilité : qualité par couche setVideoLayerPolicy et abonnement sélectif (LunionMeetClient.setSubscribed) pour les grandes réunions.
  • Chat & réactions : sendChat / sendReaction(envoi). La réception via le hook n'est pas encore exposée — utilisez les callbacks onChat/onReaction de LunionMeetClient si besoin.

Chiffrement de bout en bout (E2EE) : indisponible sur React Native

L'E2EE média par frame n'est pas supportée par react-native-webrtc standard (ni insertable streams, ni FrameCryptor natif). Le SDK Flutter, lui, propose l'E2EE. Détails et voie de contournement dans le README du paquet.

Même protocole que le web et Flutter

Le SDK React Native réutilise @lunionlab/meet-client-js : web et mobile se rejoignent dans la même salle.