# Get service quality information > The code on this page works with either the **default UI** or the **custom UI**. Use service quality callbacks to get insight on video, audio, and screen sharing quality during a session and notify users of unstable network conditions. ## See video quality The `MobileRTCMeetingService` interface provides a method `queryNetworkQuality()` to the `MobileRTCNetworkQuality` object, which provides both sent and received video network quality data for the local user. You can also use the callback `onSinkMeetingVideoQualityChanged()` under `MobileRTCMeetingServiceDelegate` to get the video quality data for all users. See the code snippet and SDK reference for details. To receive this data, there must be at least two users sending or transmitting video to the session. ```swift // Get video (.VIDEO) network quality for local user // The withDataFlow parameter of TRUE indicates send data and FALSE indicates receive data. MobileRTC.shared().getMeetingService()?.queryNetworkQuality(.VIDEO, withDataFlow: true) MobileRTC.shared().getMeetingService()?.queryNetworkQuality(.VIDEO, withDataFlow: false) // Return result of queryNetworkQuality is the enum MobileRTCNetworkQuality typedef NS_ENUM(NSInteger, MobileRTCNetworkQuality) { MobileRTCNetworkQuality_Unknown = -1, MobileRTCNetworkQuality_VeryBad = 0, MobileRTCNetworkQuality_Bad = 1, MobileRTCNetworkQuality_NotGood = 2, MobileRTCNetworkQuality_Normal = 3, MobileRTCNetworkQuality_Good = 4, MobileRTCNetworkQuality_Excellent = 5, }; // Callback for getting all users video quality. func onSinkMeetingVideoQualityChanged(_ qality: MobileRTCVideoQuality, userID: UInt) { } // Return result of onSinkMeetingVideoQualityChanged is the enum MobileRTCVideoQuality typedef NS_ENUM(NSInteger, MobileRTCVideoQuality) { MobileRTCVideoQuality_Unknown = 0, MobileRTCVideoQuality_Bad = 1, MobileRTCVideoQuality_Normal = 2, MobileRTCVideoQuality_Good = 3, }; ``` ```objectivec // Get video (MobileRTCComponentType_VIDEO) network quality for local user // The withDataFlow parameter of TRUE indicates send data and FALSE indicates receive data. [[[MobileRTC sharedRTC] getMeetingService] queryNetworkQuality:MobileRTCComponentType_VIDEO withDataFlow:YES]; [[[MobileRTC sharedRTC] getMeetingService] queryNetworkQuality:MobileRTCComponentType_VIDEO withDataFlow:NO]; // Return result of queryNetworkQuality is the enum MobileRTCNetworkQuality typedef NS_ENUM(NSInteger, MobileRTCNetworkQuality) { MobileRTCNetworkQuality_Unknown = -1, MobileRTCNetworkQuality_VeryBad = 0, MobileRTCNetworkQuality_Bad = 1, MobileRTCNetworkQuality_NotGood = 2, MobileRTCNetworkQuality_Normal = 3, MobileRTCNetworkQuality_Good = 4, MobileRTCNetworkQuality_Excellent = 5, }; // Callback for getting all users video quality. - (void)onSinkMeetingVideoQualityChanged:(MobileRTCNetworkQuality)qality userID:(NSUInteger)userID { } // Return result of onSinkMeetingVideoQualityChanged is the enum MobileRTCVideoQuality typedef NS_ENUM(NSInteger, MobileRTCVideoQuality) { MobileRTCVideoQuality_Unknown = 0, MobileRTCVideoQuality_Bad = 1, MobileRTCVideoQuality_Normal = 2, MobileRTCVideoQuality_Good = 3, }; ``` ## See audio quality The `MobileRTCMeetingService` interface provides a method `queryNetworkQuality()` to the `MobileRTCNetworkQuality` object, which provides both sent and received audio network quality data for the local user. See the code snippet and SDK reference for details. To receive this data, there must be at least two users actively sending audio to the session. ```swift // Get audio (.AUDIO) network quality for local user // The withDataFlow parameter of TRUE indicates send data and FALSE indicates receive data. MobileRTC.shared().getMeetingService()?.queryNetworkQuality(.AUDIO, withDataFlow: true) MobileRTC.shared().getMeetingService()?.queryNetworkQuality(.AUDIO, withDataFlow: false) // Return result of queryNetworkQuality is the enum MobileRTCNetworkQuality typedef NS_ENUM(NSInteger, MobileRTCNetworkQuality) { MobileRTCNetworkQuality_Unknown = -1, MobileRTCNetworkQuality_VeryBad = 0, MobileRTCNetworkQuality_Bad = 1, MobileRTCNetworkQuality_NotGood = 2, MobileRTCNetworkQuality_Normal = 3, MobileRTCNetworkQuality_Good = 4, MobileRTCNetworkQuality_Excellent = 5, }; ``` ```objectivec // Get audio (MobileRTCComponentType_AUDIO) network quality for local user // The withDataFlow parameter of TRUE indicates send data and FALSE indicates receive data. [[[MobileRTC sharedRTC] getMeetingService] queryNetworkQuality:MobileRTCComponentType_AUDIO withDataFlow:YES]; [[[MobileRTC sharedRTC] getMeetingService] queryNetworkQuality:MobileRTCComponentType_AUDIO withDataFlow:NO]; // Return result of queryNetworkQuality is the enum MobileRTCNetworkQuality typedef NS_ENUM(NSInteger, MobileRTCNetworkQuality) { MobileRTCNetworkQuality_Unknown = -1, MobileRTCNetworkQuality_VeryBad = 0, MobileRTCNetworkQuality_Bad = 1, MobileRTCNetworkQuality_NotGood = 2, MobileRTCNetworkQuality_Normal = 3, MobileRTCNetworkQuality_Good = 4, MobileRTCNetworkQuality_Excellent = 5, }; ``` ## See screen sharing quality The `MobileRTCMeetingService` interface provides a method `queryNetworkQuality()` to the `MobileRTCNetworkQuality` object, which provides both sent and received share network quality data for the local user. See the code snippet and SDK reference for details. To receive this data, there must be at least two users in the session, with at least one sharing their screen. ```swift // Get share (.AS) network quality for local user // The withDataFlow parameter of TRUE indicates send data and FALSE indicates receive data. MobileRTC.shared().getMeetingService()?.queryNetworkQuality(.AS, withDataFlow: true) MobileRTC.shared().getMeetingService()?.queryNetworkQuality(.AS, withDataFlow: false) // Return result of queryNetworkQuality is the enum MobileRTCNetworkQuality typedef NS_ENUM(NSInteger, MobileRTCNetworkQuality) { MobileRTCNetworkQuality_Unknown = -1, MobileRTCNetworkQuality_VeryBad = 0, MobileRTCNetworkQuality_Bad = 1, MobileRTCNetworkQuality_NotGood = 2, MobileRTCNetworkQuality_Normal = 3, MobileRTCNetworkQuality_Good = 4, MobileRTCNetworkQuality_Excellent = 5, }; ``` ```objectivec // Get audio (MobileRTCComponentType_AS) network quality for local user // The withDataFlow parameter of TRUE indicates send data and FALSE indicates receive data. [[[MobileRTC sharedRTC] getMeetingService] queryNetworkQuality:MobileRTCComponentType_AS withDataFlow:YES]; [[[MobileRTC sharedRTC] getMeetingService] queryNetworkQuality:MobileRTCComponentType_AS withDataFlow:NO]; // Return result of queryNetworkQuality is the enum MobileRTCNetworkQuality typedef NS_ENUM(NSInteger, MobileRTCNetworkQuality) { MobileRTCNetworkQuality_Unknown = -1, MobileRTCNetworkQuality_VeryBad = 0, MobileRTCNetworkQuality_Bad = 1, MobileRTCNetworkQuality_NotGood = 2, MobileRTCNetworkQuality_Normal = 3, MobileRTCNetworkQuality_Good = 4, MobileRTCNetworkQuality_Excellent = 5, }; ``` ---