Swift

Videostatistiken verwalten

In diesem Schritt implementieren Sie OTSubscriberKitNetworkStatsDelegate um Ruckler zu diagnostizieren und den Zustand des Oberflächennetzwerks in Ihrer App zu überprüfen.

Was Sie überwachen werden Wie die Lieferung erfolgt Anwendungsmöglichkeiten
videoPacketsLost / videoBytesReceived Periodisch — videoNetworkStatsUpdated Überprüfen Sie, ob der Empfangskanal Probleme aufweist (Ruckeln, Einfrieren)
transport (lokale Downlink-Bandbreite) Periodisch — mediaLinkStatsUpdated Vorschlagen „Deine Verbindung scheint schwach zu sein“
remotePublisherTransport (Fernübertragung) Periodisch — mediaLinkStatsUpdated Vorschlagen „Das Netzwerk des anderen Teilnehmers ist möglicherweise instabil.“
networkDegradationSource Periodisch und bei Änderung Lokale oder Remote-Nachrichtenübermittlung wählen
Wesentliche Änderung im Netzwerk Veranstaltung - networkConditionChanged Banner, Toasts, Support-Protokolle

iOS-spezifisch: Regelmäßige Statistiken und Netzwerkstatus Veranstaltungen sind Methoden auf der dasselbe OTSubscriberKitNetworkStatsDelegate—kein eigenständiger Listener-Typ.

Den Delegaten in einer Erweiterung übernehmen:

extension VonageVideoManager: OTSubscriberKitNetworkStatsDelegate {
    // ...
}

1. Videostatistiken der Abonnenten verwalten

func subscriber(_ subscriber: OTSubscriberKit, videoNetworkStatsUpdated stats: OTSubscriberKitVideoNetworkStats) {
    print("videoBytesReceived=\(stats.videoBytesReceived)")
    print("videoPacketsLost=\(stats.videoPacketsLost)")
    print("videoPacketsReceived=\(stats.videoPacketsReceived)")

    DispatchQueue.main.async {
        self.latestObservabilityStats = ObservabilityStats.fromVideoStats(
            stats,
            mediaLink: self.latestMediaLinkSnapshot
        )
    }
}

Callbacks können außerhalb der Hauptwarteschlange eintreffen. Aktualisierung @Published Overlay-Zustand auf dem Haupt Warteschlange.

func subscriber(_ subscriber: OTSubscriberKit, mediaLinkStatsUpdated mediaLinkStats: OTSubscriberKitMediaLinkStats) {
    applyMediaLinkStats(mediaLinkStats)
}

3. Ereignisse im Zusammenhang mit dem Netzwerkzustand behandeln

Umsetzung subscriber(_:networkConditionChanged:reason:) Für wesentliche Änderungen – siehe Zustand des Netzes:

func subscriber(
    _ subscriber: OTSubscriberKit,
    networkConditionChanged mediaLinkStats: OTSubscriberKitMediaLinkStats,
    reason: OTNetworkReason
) {
    print("networkConditionChanged reason=\(reason.rawValue)")
    applyMediaLinkStats(mediaLinkStats, networkConditionChangeReason: reason)
    handleNetworkDegradation(mediaLinkStats)
}

Gemeinsamer Merge-Helper:

private func applyMediaLinkStats(
    _ mediaLinkStats: OTSubscriberKitMediaLinkStats,
    networkConditionChangeReason: OTNetworkReason? = nil
) {
    let localBandwidth = mediaLinkStats.transport?.connectionEstimatedBandwidth
    let remoteBandwidth = mediaLinkStats.remotePublisherTransport?.connectionEstimatedBandwidth
    let localCondition = mediaLinkStats.transport?.networkCondition
    let remoteCondition = mediaLinkStats.remotePublisherTransport?.networkCondition

    DispatchQueue.main.async {
        self.latestMediaLinkSnapshot = MediaLinkSnapshot(
            localEstimatedBandwidth: localBandwidth,
            remoteEstimatedBandwidth: remoteBandwidth,
            networkDegradationSource: mediaLinkStats.networkDegradationSource,
            localNetworkCondition: localCondition,
            remoteNetworkCondition: remoteCondition,
            lastNetworkConditionChangeReason: networkConditionChangeReason
        )
        if var current = self.latestObservabilityStats {
            current.merge(mediaLink: self.latestMediaLinkSnapshot)
            self.latestObservabilityStats = current
        }
    }
}

4. Reaktion auf Ereignisse im Zusammenhang mit einer Verschlechterung der Netzwerkbedingungen

private func handleNetworkDegradation(_ mediaLinkStats: OTSubscriberKitMediaLinkStats) {
    let localCondition = mediaLinkStats.transport?.networkCondition ?? .unknown
    let remoteCondition = mediaLinkStats.remotePublisherTransport?.networkCondition ?? .unknown

    switch mediaLinkStats.networkDegradationSource {
    case .local:
        print("Local network degraded (condition=\(localCondition.rawValue))")
        // e.g. show: "Your connection looks weak"
    case .remote:
        print("Remote publisher network degraded (condition=\(remoteCondition.rawValue))")
        // e.g. show: "The other participant's network may be unstable"
    case .bothOrUnclear:
        print("Degradation unclear — local=\(localCondition.rawValue) remote=\(remoteCondition.rawValue)")
    default:
        break
    }
}

Definieren Sie ObservabilityStats, MediaLinkSnapshot, sowie Helper in Ihrem Projekt (orientieren Sie sich am Modell des Android-Beispiels). Wenn remotePublisherTransport bleibt null, bestätige die fern verwendeter Verlag settings.senderStatsTrack = true.

Weiter: Die zusammengeführten Statistiken an SwiftUI übergeben und das Overlay rendern.