网络探测工具是融云提供的一款 SDK 插件,可有效探测当前客户端连接融云服务的质量,返回详细数据报告。
客户将其集成在自己的测试应用或正式应用中,选择合适的时机进行探测,可实现质量数据的上报,快速定位、解决问题。
网络探测流程
sequenceDiagram
App->>NetworkTester: 初始化插件
NetworkTester-->>App: 成功或失败
App->>NetworkTester: 注册回调监听
App->>NetworkTester: 开始探测
NetworkTester->>Server: 探测中
NetworkTester-->>App: 回调返回探测中的信息
App->>NetworkTester: (可选)主动结束探测
NetworkTester-->>App: 回调返回最终探测结果
NetworkTester->>Server: 上报探测结果
前提条件
- 获取 App Key,以及确定 App Key 所属的数据中心
- 获取 Token,例如当前客户端用户的 Token
集成网络探测插件
网络探测插件支持以 cocopods 方式集成。
-
在
podfile
中添加如下内容:# SDK 版本 pod 'RongNetworkDetector', '1.0.0'
-
请在终端中运行以下命令:
pod install
如果出现找不到相关版本的问题,可先执行
pod repo update
,再执行pod install
。
探测网络质量
-
初始化网络探测插件。
/// token NSString *token = ... /// App Key NSString *appKey = ... /* 区域码 RCDetectorDataCenterBeiJing = 1, //北京 RCDetectorDataCenterSingapore = 2, //新加坡 RCDetectorDataCenterNorthAmerica = 3 // 北美 */ RCDetectorDataCenter code = .... self.detector = [[RCNetworkDetector alloc] initWithAppKey:appKey token:token dataCenter:code];
-
初始化成功后,注册网络探测结果监听器。探测过程中会通过
RCNetworkDetectorDelegate
协议中提供的方法逐条上报 Navi 服务地址、CMP 服务地址和最终探测结果。一般来说,App 仅需关注最终探测结果。/// 添加探测代理 [self.detector addDetectorDelegate:self]; ///移除代理 [self.detector removeDetectorDelegate:self];
-
开始探测。
/// 开始探测 [self.detector start];
探测过程中会执行以下回调方法, 反馈探测结果。
/// 网络探测开始 /// - Parameters: /// - detector: 探测器 /// - sessionID: 会话ID - (void)networkDetector:(RCNetworkDetector *)detector startWith:(NSString *)sessionID; /// 上报 Navi 探测结果 /// - Parameters: /// - detector: 探测器 /// - result: Navi 探测结果 /// - index: navi 索引 /// - count: navi 地址总数 /// - error: 错误信息 - (void)networkDetector:(RCNetworkDetector *)detector reportNaviResult:(RCNaviConnectResult *)result index:(NSInteger)index count:(NSInteger)count error:(NSError *__nullable)error; /// 上报CMP 探测 /// - Parameters: /// - detector: 探测器 /// - result: CMP 探测结果 /// - index: CMP 索引 /// - count: CMP数量 /// - error: 错误信息 - (void)networkDetector:(RCNetworkDetector *)detector reportCMPResult:(RCCMPConnectResult *)result index:(NSInteger)index count:(NSInteger)count error:(NSError *__nullable)error; /// 探测结束 /// - Parameters: /// - detector: 探测器 /// - result: 探测类别 /// - error: 错误信息 - (void)networkDetector:(RCNetworkDetector *)detector finishedWith:(RCDetectorResult)result error:(NSError *__nullable)error;
-
探测完成后自动结束。
在探测进行过程中,您也可以主动停止探测。停止后,插件也会返回最终探测结果。
/// 结束探测 [self.detector stop];
查询网络探测数据
网络探测插件还提供以下查询方法:
/// 获取Navi 结果
- (NSArray<RCNaviConnectResult *> *)getNaviResults;
/// 获取CMP 结果
- (NSArray<RCCMPConnectResult *> *)getCMPResults;
/// 获取会话ID
- (NSString *)getSessionID;
/// 获取设备信息
- (RCNDeviceInfo *)getDeviceInfo;
参考资源
RCNaviConnectResult
导航探测结果
@interface RCNaviConnectResult : NSObject
// navi 地址
@property(nonatomic, copy) NSString *address;
// navi 版本
@property(nonatomic, assign) RCDNaviVersion version;
// 请求状态
@property(nonatomic, assign) RCDetectorStatus status;
// 总耗时
@property(nonatomic, assign) NSInteger cost;
// tcp 耗时
@property(nonatomic, assign) NSInteger connect;
// dns 耗时
@property(nonatomic, assign) NSInteger dns;
// 系统错误码
@property(nonatomic, assign) NSInteger code;
// 远端IP
@property(nonatomic, copy) NSString *remote;
// http 状态码
@property(nonatomic, assign) NSInteger httpCode;
// 系统错误描述
@property(nonatomic, copy) NSString *message;
@end
RCCMPConnectResult
CMP探测结果
@interface RCCMPConnectResult : NSObject
// 探测地址
@property(nonatomic, copy) NSString *address;
// 探测类型: HttpTLS, HttpNoneTLS, WebSocketTLS, WebSocketNoneTLS
@property(nonatomic, copy) RCCMPType type;
// 探测状态: 成功,失败, 超时
@property(nonatomic, assign) RCDetectorStatus status;
// 探测耗时
@property(nonatomic, assign) NSInteger cost;
//tcp耗时
@property(nonatomic, assign) NSInteger connect;
//dns耗时
@property(nonatomic, assign) NSInteger dns;
//业务链接耗时
@property(nonatomic, assign) NSInteger bs;
// 业务链接结果
@property(nonatomic, assign) NSInteger rmtpStatus;
//TCP 错误码
@property(nonatomic, assign) NSInteger connectCode;
// rmtp 错误码
@property(nonatomic, assign) NSInteger rmtpCode;
@end
RCNDeviceInfo
设备信息
@interface RCNDeviceInfo : NSObject
/// 网络类型
@property(nonatomic, copy) NSString *networkType;
/// 系统版本
@property(nonatomic, copy) NSString *osVersion;
/// 设备类型
@property(nonatomic, copy) NSString *deviceModel;
/// gateway
@property(nonatomic, copy) NSString *gateway;
/// dns
@property(nonatomic, copy) NSString *dns;
/// 运营商
@property(nonatomic, copy) NSString *carrierName;
/// 代理
@property(nonatomic, assign) BOOL isProxy;
/// 信号强度(iOS 暂不支持)
@property(nonatomic, assign) NSInteger signal;
@end