콘텐츠로 이동

RUM 설정

RUM 초기화 설정

    //开启 rum
    FTRumConfig *rumConfig = [[FTRumConfig alloc]initWithAppid:appid];
    rumConfig.enableTraceUserView = YES;
    rumConfig.deviceMetricsMonitorType = FTDeviceMetricsMonitorAll;
    rumConfig.monitorFrequency = FTMonitorFrequencyRare;
    rumConfig.enableTraceUserAction = YES;
    rumConfig.enableTraceUserResource = YES;
    rumConfig.enableTrackAppFreeze = YES;
    rumConfig.enableTrackAppCrash = YES;
    rumConfig.enableTrackAppANR = YES;
    rumConfig.errorMonitorType = FTErrorMonitorAll;
    [[FTMobileAgent sharedInstance] startRumWithConfigOptions:rumConfig];
    let rumConfig = FTRumConfig(appid: appid)
    rumConfig.enableTraceUserView = true
    rumConfig.deviceMetricsMonitorType = .all
    rumConfig.monitorFrequency = .rare
    rumConfig.enableTraceUserAction = true
    rumConfig.enableTraceUserResource = true
    rumConfig.enableTrackAppFreeze = true
    rumConfig.enableTrackAppCrash = true
    rumConfig.enableTrackAppANR = true
    rumConfig.errorMonitorType = .all
    FTMobileAgent.sharedInstance().startRum(withConfigOptions: rumConfig)
속성 타입 필수 설명
appid NSString RUM 애플리케이션 ID 고유 식별자입니다. RUM appid를 설정해야 RUM 수집 기능이 활성화됩니다. appid 획득 방법
sampleRate int 아니요 샘플링 비율. 범위 [0,100], 0은 수집 안 함, 100은 전체 수집을 의미하며 기본값은 100입니다. 동일한 session_id 내의 모든 View, Action, LongTask, Error 데이터에 적용됩니다.
sessionOnErrorSampleRate int 아니요 오류 수집률 설정. 세션이 sampleRate에 의해 샘플링되지 않은 경우, 세션 중 오류가 발생하면 오류 발생 전 1분 범위의 데이터를 수집할 수 있습니다. 범위 [0,100], 0은 수집 안 함, 100은 전체 수집을 의미하며 기본값은 0입니다. 동일한 session_id 내의 모든 View, Action, LongTask, Error 데이터에 적용됩니다. SDK 1.5.16 이상 지원
enableTrackAppCrash BOOL 아니요 충돌 로그 수집 여부를 설정합니다. 기본값 NO
enableTrackAppANR BOOL 아니요 ANR(애플리케이션 응답 없음) 이벤트를 수집합니다. 기본값 NO
enableTrackAppFreeze BOOL 아니요 UI 멈춤 이벤트를 수집합니다. 기본값 NO. -setEnableTrackAppFreeze:freezeDurationMs: 메서드를 통해 멈춤 수집을 활성화하고 임계값을 설정할 수 있습니다.
freezeDurationMs long 아니요 UI 멈춤 임계값을 설정합니다. 범위 [100,), 단위는 밀리초, 기본값 250ms입니다. SDK 1.5.7 이상 버전 지원
enableTraceUserView BOOL 아니요 사용자 View 작업 추적 여부를 설정합니다. 기본값 NO
enableTraceUserAction BOOL 아니요 사용자 Action 작업 추적 여부를 설정합니다. 기본값 NO. view.accessibilityIdentifier를 통해 action_name을 사용자 정의할 수 있습니다.
enableTraceUserResource BOOL 아니요 사용자 네트워크 요청 추적 여부를 설정합니다. 기본값 NO, 네이티브 HTTP에만 적용됩니다. 주의: [NSURLSession sharedSession]을 통해 시작된 네트워크 요청은 성능 데이터를 수집할 수 없습니다. SDK 1.5.9 이상에서는 Swift의 URLSession async/await APIs를 통해 시작된 네트워크 요청 수집을 지원합니다.
resourceUrlHandler FTResourceUrlHandler 아니요 리소스 수집 규칙을 사용자 정의합니다. 기본값은 필터링하지 않습니다. NO를 반환하면 수집, YES를 반환하면 수집하지 않음을 의미합니다.
errorMonitorType FTErrorMonitorType 아니요 오류 이벤트 모니터링 보충 유형입니다. 수집된 충돌 데이터에 모니터링 정보를 추가합니다. FTErrorMonitorBattery는 배터리 잔량, FTErrorMonitorMemory는 메모리 사용량, FTErrorMonitorCpu는 CPU 점유율입니다. 기본값은 설정되지 않음입니다.
deviceMetricsMonitorType FTDeviceMetricsMonitorType 아니요 View의 성능 모니터링 유형입니다. 기본값은 설정되지 않음입니다. 수집된 View 데이터에 해당 모니터링 항목 정보를 추가합니다. FTDeviceMetricsMonitorMemory는 현재 애플리케이션의 메모리 사용량 모니터링, FTDeviceMetricsMonitorCpu는 CPU 사용량 모니터링, FTDeviceMetricsMonitorFps는 화면 프레임 속도 모니터링입니다.
monitorFrequency FTMonitorFrequency 아니요 View 성능 모니터링 샘플링 주기입니다. FTMonitorFrequencyDefault 500ms(기본값), FTMonitorFrequencyFrequent 100ms, FTMonitorFrequencyRare 1000ms
enableResourceHostIP BOOL 아니요 요청 대상 도메인 주소의 IP를 수집할지 여부입니다. >= iOS 13.0, >= tvOS 13.0에서 지원됩니다.
globalContext NSDictionary 아니요 사용자 모니터링 데이터 소스 구분을 위한 사용자 정의 태그를 추가합니다. 추적 기능이 필요하면 파라미터 keytrack_id, value는 임의의 숫자입니다. 추가 규칙은 여기를 참조하세요.
rumCacheLimitCount int 아니요 RUM 최대 캐시량입니다. 기본값 100_000, SDK 1.5.8 이상 버전에서 지원됩니다.
rumDiscardType FTRUMCacheDiscard 아니요 RUM 폐기 규칙을 설정합니다. 기본값 FTRUMCacheDiscard. FTRUMCacheDiscard는 RUM 데이터 수가 최대값보다 크면 추가 데이터를 폐기합니다. FTRUMDiscardOldest는 RUM 데이터가 최대값보다 크면 오래된 데이터를 폐기합니다. SDK 1.5.8 이상 버전에서 지원됩니다.
resourcePropertyProvider FTResourcePropertyProvider 아니요 block 콜백을 통해 RUM Resource 사용자 정의 속성을 추가합니다. SDK 1.5.10 이상 버전에서 지원됩니다. 우선순위는 URLSession 사용자 정의 수집보다 낮습니다.
enableTraceWebView BOOL 아니요 WebView 데이터 수집 활성화 여부를 설정합니다. 기본값 YES. SDK 1.5.17 이상 지원
allowWebViewHost NSArray 아니요 데이터 추적을 허용할 WebView host 주소를 설정합니다. nil이면 전체 수집, 기본값은 nil입니다. SDK 1.5.17 이상 지원
sessionTaskErrorFilter FTSessionTaskErrorFilter 아니요 URLSessionTask Error를 차단할지 여부를 설정합니다. 차단 확인 시 YES 반환, 차단하지 않으면 NO 반환, 차단 후 RUM-Error는 해당 오류를 수집하지 않습니다. SDK 1.5.17 이상 지원
issueDataProvider FTIssueDataProvider 아니요 SDK가 자동 수집하는 Crash 및 ANR RUM Error에 사용자 정의 필드를 동기적으로 추가합니다. enableTrackAppCrash 또는 enableTrackAppANR을 각각 활성화해야 합니다. SDK 1.6.7 이상 지원. 사용 방법은 Error 사용자 정의 필드를 참조하세요.
viewTrackingHandler FTViewTrackingHandler 아니요 View 추적 로직을 사용자 정의하여 어떤 ViewController를 RUM View로 모니터링할지 결정하고 View Name을 사용자 정의합니다. 적용 조건: enableTraceUserView = YES. SDK 1.5.18 이상 지원, 사용 예시는 여기를 참조하세요.
swiftUIViewTrackingHandler FTSwiftUIViewTrackingHandler 아니요 실험적. SwiftUI View 자동 수집 로직을 사용자 정의하여 자동 추출된 SwiftUI View Name을 필터링하고 RUM View Name을 사용자 정의합니다. 적용 조건: enableTraceUserView = YES이며 이 설정이 비어 있지 않아야 합니다. 필터링이나 이름 지정이 필요 없는 경우 FTDefaultSwiftUIViewTrackingHandler를 설정할 수 있습니다. 이 실험적 API는 이후 버전에서 변경될 수 있습니다. SDK 1.6.4 이상 지원, 사용 예시는 여기를 참조하세요.
actionTrackingHandler FTActionTrackingHandler 아니요 Action 추적 로직을 사용자 정의하여 기록할 RUM Action 이벤트를 필터링하고 Action Name을 사용자 정의합니다. 적용 조건: enableTraceUserAction = YES. SDK 1.5.18 이상 지원, 사용 예시는 여기를 참조하세요.
crashMonitoring FTCrashMonitorType 아니요 SDK 충돌 모니터링 유형 범위를 설정합니다. 기본값은 FTCrashMonitorTypeHighCompatibility(높은 호환성 모드 사전 설정 매크로)입니다. 적용 조건: enableTrackAppCrash = YES. 참고: FTCrashMonitorTypeSystem | FTCrashMonitorTypeApplicationState를 지정해야 하며, 이는 보고서에 중요한 정보를 제공합니다. SDK 1.5.19 이상 지원
샘플링 비율 파라미터 이름

SDK 1.6.6 이상 버전에서 samplerate는 더 이상 사용되지 않습니다(Deprecated). 현재는 계속 사용할 수 있으며 sampleRate와 동일한 값에 매핑됩니다. 새 코드에서는 sampleRate를 사용하는 것이 좋습니다. 1.6.6 미만 버전에서는 계속 samplerate를 사용하세요.

RUM 사용자 데이터 추적

FTRUMConfig에서 enableTraceUserAction, enableTraceUserView, enableTraceUserResource, enableTrackAppFreeze, enableTrackAppCrashenableTrackAppANR을 구성하여 Action, View, Resource, LongTask, Error 데이터의 자동 수집 추적을 활성화합니다. 사용자 정의 수집이 필요한 경우 FTExternalDataManager를 통해 데이터를 업로드할 수 있습니다.

View

사용 방법

/// 创建页面
///
/// 在 `-startViewWithName` 方法前调用,该方法用于记录页面的加载时间,如果无法获得加载时间该方法可以不调用。
/// - Parameters:
///  - viewName: 页面名称
///  - loadTime: 页面加载时间(纳秒级)
-(void)onCreateView:(NSString *)viewName loadTime:(NSNumber *)loadTime;

/// 进入页面
/// - Parameters:
///  - viewName: 页面名称
///  - property: 事件自定义属性(可选)
-(void)startViewWithName:(NSString *)viewName property:(nullable NSDictionary *)property;

/// 更新当前 RUM View 的加载时间。
/// 必须在 `-startView` 和 `-stopView` 方法之间调用才能生效。
/// - Parameter duration: 加载时长(纳秒级)。
-(void)updateViewLoadingTime:(NSNumber *)duration;

/// 离开页面
/// - Parameter property: 事件自定义属性(可选)
-(void)stopViewWithProperty:(nullable NSDictionary *)property;
/// 创建页面
///
/// 在 `-startViewWithName` 方法前调用,该方法用于记录页面的加载时间,如果无法获得加载时间该方法可以不调用。
/// - Parameters:
///  - viewName: 页面名称
///  - loadTime: 页面加载时间(ns)
open func onCreateView(_ viewName: String, loadTime: NSNumber)

/// 进入页面
/// - Parameters:
///  - viewName: 页面名称
///  - property: 事件自定义属性(可选)
open func startView(withName viewName: String, property: [AnyHashable : Any]?)

/// 更新当前 RUM View 的加载时间。
/// 必须在 `-startView` 和 `-stopView` 方法之间调用才能生效。
/// - Parameter duration: 加载时长(纳秒级)。
open func updateViewLoadingTime(_ duration: NSNumber)

/// 离开页面
/// - Parameter property: 事件自定义属性(可选)
open func stopView(withProperty property: [AnyHashable : Any]?)

코드 예시

- (void)viewDidAppear:(BOOL)animated{
  [super viewDidAppear:animated];
  // 场景 1:
  [[FTExternalDataManager sharedManager] startViewWithName:@"TestVC"];

  // 场景 2:动态参数
  [[FTExternalDataManager sharedManager] startViewWithName:@"TestVC" property:@{@"custom_key":@"custom_value"}];
}
-(void)viewDidDisappear:(BOOL)animated{
  [super viewDidDisappear:animated];
  // 场景 1:
  [[FTExternalDataManager sharedManager] stopView];

  // 场景 2:动态参数
  [[FTExternalDataManager sharedManager] stopViewWithProperty:@{@"custom_key":@"custom_value"}];
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // 场景 1:
    FTExternalDataManager.shared().startView(withName: "TestVC")
    // 场景 2:动态参数
    FTExternalDataManager.shared().startView(withName: "TestVC",property: ["custom_key":"custom_value"])
}
override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    // 场景 1:
    FTExternalDataManager.shared().stopView()
    // 场景 2:动态参数
    FTExternalDataManager.shared().stopView(withProperty: ["custom_key":"custom_value"])
}

SwiftUI View 수집

SwiftUI View는 자동 수집과 수동 수집을 지원합니다.

  • 자동 수집(실험적): SDK가 페이지를 자동으로 식별하고 FTRumConfig.swiftUIViewTrackingHandler를 통해 통합적으로 필터링 및 이름을 지정합니다. 사용 방법은 SwiftUI View 자동 수집(실험적)을 참조하세요.
  • 수동 수집: 특정 SwiftUI View에서 .ftTrackRUMView(name:property:)를 사용하여 페이지의 시작과 끝을 명시적으로 표시하고 View Name 및 속성을 사용자 정의합니다. 안정적인 페이지 이름이 필요하거나 View 수명 주기를 정밀하게 제어해야 하거나, 자동 추출된 이름이 예상과 다른 경우에 적합합니다.
import SwiftUI
import GuanceSDK
struct HomeView: View {
    var body: some View {
        VStack {
            Text("Home")
        }
        .ftTrackRUMView(
            name: "Home",
            property: ["page_type": "home"]
        )
    }
}

Action

사용 방법

/// 启动 RUM Action。
///
/// RUM 会绑定该 Action 可能触发的 Resource、Error、LongTask 事件。避免在 0.1 s 内多次添加,同一个 View 在同一时间只会关联一个 Action,在上一个 Action 未结束时,新增的 Action 会被丢弃。
/// 与 `addAction:actionType:property` 方法添加 Action 互不影响。
///
/// - Parameters:
///   - actionName: 事件名称
///   - actionType: 事件类型
///   - property: 事件自定义属性(可选)
- (void)startAction:(NSString *)actionName actionType:(NSString *)actionType property:(nullable NSDictionary *)property;

/// 添加 Action 事件. 无丢弃逻辑,不会绑定 Resource、Error、LongTask 事件
///
/// 与 `startAction:actionType:property:` 启动的 RUM Action 互不影响。
/// - Parameters:
///   - actionName: 事件名称
///   - actionType: 事件类型
///   - property: 事件自定义属性(可选)
- (void)addAction:(NSString *)actionName actionType:(NSString *)actionType property:(nullable NSDictionary *)property;
/// 启动 RUM Action。
///
/// RUM 会绑定该 Action 可能触发的 Resource、Error、LongTask 事件。避免在 0.1 s 内多次添加,同一个 View 在同一时间只会关联一个 Action,在上一个 Action 未结束时,新增的 Action 会被丢弃。
/// 与 `addAction:actionType:property` 方法添加 Action 互不影响。
///
/// - Parameters:
///   - actionName: 事件名称
///   - actionType: 事件类型
///   - property: 事件自定义属性(可选)
open func startAction(_ actionName: String, actionType: String, property: [AnyHashable : Any]?)

/// 添加 Action 事件.无丢弃逻辑,不会绑定 Resource、Error、LongTask 事件
///
/// 与 `startAction:actionType:property:` 启动的 RUM Action 互不影响。
/// - Parameters:
///   - actionName: 事件名称
///   - actionType: 事件类型
///   - property: 事件自定义属性(可选)
open func addAction(_ actionName: String, actionType: String, property: [AnyHashable : Any]?)

코드 예시

// startAction
[[FTExternalDataManager sharedManager] startAction:@"action" actionType:@"click" property:@{@"action_property":@"testActionProperty1"}];
// addAction
[[FTExternalDataManager sharedManager] addAction:@"action" actionType:@"click" property:@{@"action_property":@"testActionProperty1"}];
// startAction
FTExternalDataManager.shared().startAction("custom_action", actionType: "click",property: nil)
// addAction
FTExternalDataManager.shared().addAction("custom_action", actionType: "click",property: nil)

SwiftUI Action 수동 수집

SwiftUI Action은 비즈니스 상호작용 지점에서 수동으로 추가해야 합니다. Button, NavigationLink, List 항목 또는 사용자 정의 제스처 등 SwiftUI 컴포넌트의 경우, 사용자 작업이 발생한 위치에서 RUM Action을 수동으로 기록하세요.

SwiftUI Action은 두 가지 수동 수집 방식을 지원합니다.

  • 기존 이벤트 클로저에서 호출: FTRUMSwiftUI.trackTapAction(name:property:)를 사용합니다. 제스처를 추가로 추가하지 않으며 Button, NavigationLink, List, 스크롤 뷰 또는 기존 사용자 정의 제스처가 있는 시나리오에 적합합니다.
  • View Modifier 사용: .ftTrackRUMTapAction(name:property:count:)를 사용합니다. 현재 View에 simultaneousGesture를 추가하며, 일반 View의 간단한 클릭 수집에 적합합니다.

참고: 동일한 클릭 이벤트가 이미 FTExternalDataManager를 통해 수동 수집된 경우, SwiftUI Action 수동 수집을 중복 사용하지 않도록 주의하여 중복 보고를 방지하세요.

import SwiftUI
import GuanceSDK
struct ProductView: View {
    var body: some View {
        Button("Buy") {
            FTRUMSwiftUI.trackTapAction(
                name: "buy_click",
                property: ["source": "product_detail"]
            )

            // 执行业务点击逻辑
            buy()
        }
    }

    private func buy() {
        // ...
    }
}
import SwiftUI
import GuanceSDK
struct ProductCard: View {
    var body: some View {
        Text("Buy")
            .ftTrackRUMTapAction(
                name: "buy_click",
                property: ["source": "product_card"]
            )
    }
}

FTRUMSwiftUI.trackTapAction(name:property:)는 특히 이미 클릭 클로저가 있는 컴포넌트의 경우 더 권장되는 수동 수집 방식입니다. .ftTrackRUMTapAction(name:property:count:)는 편리한 작성 방법이지만, 클릭 제스처를 추가로 추가하기 때문에 List, NavigationLink, 스크롤 컨테이너 또는 복잡한 제스처 조합에서 기존 상호작용에 영향을 줄 수 있으므로, 기존 클릭 클로저에서 FTRUMSwiftUI.trackTapAction(name:property:)를 호출하는 방식으로 변경하는 것이 좋습니다.

Error

사용 방법

/// 添加 Error 事件
/// - Parameters:
///   - type: error 类型
///   - message: 错误信息
///   - stack: 堆栈信息
///   - property: 事件自定义属性(可选)
- (void)addErrorWithType:(NSString *)type message:(NSString *)message stack:(NSString *)stack property:(nullable NSDictionary *)property;

/// 添加 Error 事件
/// - Parameters:
///   - type: error 类型
///   - state: 程序运行状态
///   - message: 错误信息
///   - stack: 堆栈信息
///   - property: 事件自定义属性(可选)
- (void)addErrorWithType:(NSString *)type state:(FTAppState)state  message:(NSString *)message stack:(NSString *)stack property:(nullable NSDictionary *)property;
/// 添加 Error 事件
/// - Parameters:
///   - type: error 类型
///   - message: 错误信息
///   - stack: 堆栈信息
///   - property: 事件自定义属性(可选)
open func addError(withType: String, message: String, stack: String, property: [AnyHashable : Any]?)

/// 添加 Error 事件
/// - Parameters:
///   - type: error 类型
///   - state: 程序运行状态
///   - message: 错误信息
///   - stack: 堆栈信息
///   - property: 事件自定义属性(可选)
open func addError(withType type: String, state: FTAppState, message: String, stack: String, property: [AnyHashable : Any]?)

코드 예시

// 场景1
[[FTExternalDataManager sharedManager] addErrorWithType:@"type" message:@"message" stack:@"stack"];
// 场景2: 动态参数
[[FTExternalDataManager sharedManager] addErrorWithType:@"ios_crash" message:@"crash_message" stack:@"crash_stack" property:@{@"custom_key":@"custom_value"}];
// 场景3: 动态参数
[[FTExternalDataManager sharedManager] addErrorWithType:@"ios_crash" state:FTAppStateUnknown message:@"crash_message" stack:@"crash_stack" property:@{@"custom_key":@"custom_value"}];
// 场景1
FTExternalDataManager.shared().addError(withType: "custom_type", message: "custom_message", stack: "custom_stack")
// 场景2: 动态参数
FTExternalDataManager.shared().addError(withType: "custom_type", message: "custom_message", stack: "custom_stack",property: ["custom_key":"custom_value"])
// 场景3: 动态参数
FTExternalDataManager.shared().addError(withType: "custom_type", state: .unknown, message: "custom_message", stack: "custom_stack", property: ["custom_key":"custom_value"])

LongTask

사용 방법

/// 添加 卡顿 事件
/// - Parameters:
///   - stack: 卡顿堆栈
///   - duration: 卡顿时长(纳秒)
///   - property: 事件自定义属性(可选)
- (void)addLongTaskWithStack:(NSString *)stack duration:(NSNumber *)duration property:(nullable NSDictionary *)property;
/// 添加 卡顿 事件
/// - Parameters:
///   - stack: 卡顿堆栈
///   - duration: 卡顿时长(纳秒)
///   - property: 事件自定义属性(可选)
func addLongTask(withStack: String, duration: NSNumber, property: [AnyHashable : Any]?)

코드 예시

// 场景1
[[FTExternalDataManager sharedManager] addLongTaskWithStack:@"stack string" duration:@1000000000];
// 场景2: 动态参数
[[FTExternalDataManager sharedManager] addLongTaskWithStack:@"stack string" duration:@1000000000 property:@{@"custom_key":@"custom_value"}];
// 场景1
FTExternalDataManager.shared().addLongTask(withStack: "stack string", duration: 1000000000)
// 场景2: 动态参数
FTExternalDataManager.shared().addLongTask(withStack: "stack string", duration: 1000000000 ,property: [["custom_key":"custom_value"]])

Resource

사용 방법

/// HTTP 请求开始
/// - Parameters:
///   - key: 请求标识
///   - property: 事件自定义属性(可选)
- (void)startResourceWithKey:(NSString *)key property:(nullable NSDictionary *)property;

/// HTTP 添加请求数据
///
/// - Parameters:
///   - key: 请求标识
///   - metrics: 请求相关性能属性
///   - content: 请求相关数据
- (void)addResourceWithKey:(NSString *)key metrics:(nullable FTResourceMetricsModel *)metrics content:(FTResourceContentModel *)content;

/// HTTP 请求结束
/// - Parameters:
///   - key: 请求标识
///   - property: 事件自定义属性(可选)
- (void)stopResourceWithKey:(NSString *)key property:(nullable NSDictionary *)property;
/// HTTP 请求开始
/// - Parameters:
///   - key: 请求标识
///   - property: 事件自定义属性(可选)
open func startResource(withKey key: String, property: [AnyHashable : Any]?)

/// HTTP 请求结束
/// - Parameters:
///   - key: 请求标识
///   - property: 事件自定义属性(可选)
open func stopResource(withKey key: String, property: [AnyHashable : Any]?)

/// HTTP 添加请求数据
///
/// - Parameters:
///   - key: 请求标识
///   - metrics: 请求相关性能属性
///   - content: 请求相关数据
open func addResource(withKey key: String, metrics: FTResourceMetricsModel?, content: FTResourceContentModel)

코드 예시

//第一步:请求开始前
[[FTExternalDataManager sharedManager] startResourceWithKey:key];

//第二步:请求完成
[[FTExternalDataManager sharedManager] stopResourceWithKey:key];

//第三步:拼接 Resource 数据
//FTResourceContentModel 数据
FTResourceContentModel *content = [[FTResourceContentModel alloc]init];
content.httpMethod = request.HTTPMethod;
content.requestHeader = request.allHTTPHeaderFields;
content.responseHeader = httpResponse.allHeaderFields;
content.httpStatusCode = httpResponse.statusCode;
content.responseBody = responseBody;
//ios native
content.error = error;

//如果能获取到各阶段的时间数据
//FTResourceMetricsModel
//ios native 获取到 NSURLSessionTaskMetrics 数据 直接使用 FTResourceMetricsModel 的初始化方法
FTResourceMetricsModel *metricsModel = [[FTResourceMetricsModel alloc]initWithTaskMetrics:metrics];

//其他平台 所有时间数据以纳秒为单位
FTResourceMetricsModel *metricsModel = [[FTResourceMetricsModel alloc]init];

//第四步:add resource 如果没有时间数据 metrics 传 nil
[[FTExternalDataManager sharedManager] addResourceWithKey:key metrics:metricsModel content:content];
//第一步:请求开始前
FTExternalDataManager.shared().startResource(withKey: key)

//第二步:请求完成
FTExternalDataManager.shared().stopResource(withKey: resource.key)

//第三步:① 拼接 Resource 数据
let contentModel = FTResourceContentModel(request: task.currentRequest!, response: task.response as? HTTPURLResponse, data: resource.data, error: error)

//② 如果能获取到各阶段的时间数据
//FTResourceMetricsModel
//ios native 获取到 NSURLSessionTaskMetrics 数据 直接使用 FTResourceMetricsModel 的初始化方法
var metricsModel:FTResourceMetricsModel?
if let metrics = resource.metrics {
   metricsModel = FTResourceMetricsModel(taskMetrics:metrics)
}
//其他平台 所有时间数据以纳秒为单位
metricsModel = FTResourceMetricsModel()
...

//第四步:add resource 如果没有时间数据 metrics 传 nil
FTExternalDataManager.shared().addResource(withKey: resource.key, metrics: metricsModel, content: contentModel)

문서 평가

이 페이지가 도움이 되었나요?