iOS 端网络探测工具使用说明

网络探测工具是融云提供的一款 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 方式集成。

  1. podfile 中添加如下内容:

    # SDK 版本
    pod 'RongNetworkDetector', '1.0.0'
    
  2. 请在终端中运行以下命令:

    pod install
    

    如果出现找不到相关版本的问题,可先执行 pod repo update,再执行 pod install

探测网络质量

  1. 初始化网络探测插件。

    /// 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];
    
    
  2. 初始化成功后,注册网络探测结果监听器。探测过程中会通过 RCNetworkDetectorDelegate 协议中提供的方法逐条上报 Navi 服务地址、CMP 服务地址和最终探测结果。一般来说,App 仅需关注最终探测结果。

     /// 添加探测代理
    [self.detector addDetectorDelegate:self];
     
    ///移除代理
    [self.detector removeDetectorDelegate:self];
    
  3. 开始探测。

    /// 开始探测
    [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;
    
    
  4. 探测完成后自动结束。

    在探测进行过程中,您也可以主动停止探测。停止后,插件也会返回最终探测结果。

    /// 结束探测
    [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