Swift

Vue d'ensemble

S'abonner à un flux distant et attribuer networkStatsDelegate pour que vous receviez les notifications statistiques. Sur iOS, les statistiques relatives aux vidéos, à l'audio et aux liens multimédias (y compris l'état du réseau) événements) sont diffusés via un seul OTSubscriberKitNetworkStatsDelegate— et non pas des objets d'écoute distincts comme sur Android.

La gestion des callbacks sera mise en œuvre à l'étape suivante.

1. S'abonner et enregistrer le délégué des statistiques réseau

Lorsqu'un flux distant est créé, créer un OTSubscriber, définir les délégués et s'abonner :

func session(_ session: OTSession, streamCreated stream: OTStream) {
    guard subscriber == nil else { return }

    let subscriber = OTSubscriber(stream: stream, delegate: self)
    subscriber.networkStatsDelegate = self   // OTSubscriberKitNetworkStatsDelegate
    self.subscriber = subscriber

    var error: OTError?
    session.subscribe(subscriber, error: &error)
    if let error {
        print("Subscribe error: \(error)")
    }
}
Délégué Ce qu'il offre
OTSubscriberDelegate Cycle de vie de la connexion, point de vue de l'abonné
OTSubscriberKitNetworkStatsDelegate Statistiques vidéo/audio, lien vers le média statistiques, état du réseau événements

Spécifique à iOS : Set (jeu de mots) networkStatsDelegate sur le abonné Par exemple. Il n'y a pas d'enregistrement distinct pour le « gestionnaire d'événements liés aux médias » — implémentation mediaLinkStatsUpdated et networkConditionChanged du même type de délégué.

2. Effacer l'état lorsque le flux prend fin

Réinitialiser l'état d'observabilité lorsque le flux est détruit :

func session(_ session: OTSession, streamDestroyed stream: OTStream) {
    subscriber = nil
    latestObservabilityStats = nil
    latestMediaLinkSnapshot = nil
    DispatchQueue.main.async {
        self.subView = nil
    }
}

En subscriberDidConnect, attribuez la vue « subscriber » à SwiftUI :

func subscriberDidConnect(toStream subscriberKit: OTSubscriberKit) {
    if let view = subscriber?.view {
        DispatchQueue.main.async {
            self.subView = view
        }
    }
}

Suivant : Implémenter les méthodes déléguées des statistiques réseau et fusionner les données pour la couche superposée.