API 및 설정

Sophonz iOS SDK의 Options 클래스, 주요 API, 그리고 초기화 예제를 설명합니다.

API 소개 및 설정

Options 클래스

SDK 초기화 시 사용하는 설정 옵션 클래스입니다. 각 파라미터의 역할은 아래와 같습니다.

@objc(SophonzOptions) public final class Options: NSObject {
 
    /// 앱 키 (Sophonz 콘솔에서 발급)
    public let appKey: String
 
    /// 데이터를 전송할 Collector 주소
    public let endpoints: Sophonz.Endpoints?
 
    /// 데이터 수집 비율 (0.0 ~ 1.0)
    /// 0.0: 수집 안 함 / 1.0: 100% 수집 (기본값: 1.0)
    public var sampleRate: Double
 
    /// 기기 ID(UUID)를 Collector로 전송할지 여부
    /// 기기 ID는 UUID를 생성하여 Keychain에 저장한 값입니다.
    public var isDeviceIdEnable: Bool
 
    /// 서비스 공간 식별자 (콘솔에서 확인)
    public var project: String?
 
    /// API 응답값으로 SDK 수집 여부를 제어합니다.
    public var sdkCollectControl: Sophonz.SDKCollectControl?
 
    /// 사용자 터치(클릭) 자동 수집 여부
    public var tapOption: Sophonz.TapOption?
 
    /// HTTP 요청의 Header 및 Body 수집 여부
    /// 설정하지 않으면 XHR은 수집하되 Header와 Body는 수집하지 않습니다.
    public var xhrOption: Sophonz.XHROption?
 
    /// WebView 세션 데이터 출처 설정
    /// true: Native가 전송한 데이터 사용 (기본값)
    /// false: WebView 자체에서 생성한 데이터 사용
    /// ※ Native 앱에서는 별도 설정이 필요 없습니다.
    public var webviewOption: Sophonz.WebviewOption?
 
    /// 배포 환경 구분
    /// 운영 환경과 테스트 환경이 동일 서버를 사용하는 경우에만 설정합니다.
    public var deployEnvironment: SophonzDeployEnvironment
}

파라미터 요약표

파라미터타입설명
appKeyString앱 키 (필수)
endpointsSophonz.Endpoints?Collector 주소
projectString?서비스 공간 식별자
sampleRateDouble수집 비율 (0.0~1.0, 기본값 1.0)
isDeviceIdEnableBool기기 UUID 전송 여부
deployEnvironmentSophonzDeployEnvironment운영/테스트 환경 구분
sdkCollectControlSDKCollectControl?API 응답으로 수집 제어
tapOptionTapOption?터치 이벤트 자동 수집 → TapOption 상세
xhrOptionXHROption?HTTP Header/Body 수집 → XHROption 상세
webviewOptionWebviewOption?WebView 세션 연결 방식 → WebviewOption 상세

TapOption 상세

Sophonz.TapOption은 사용자의 탭(클릭) 이벤트 수집 방식을 설정하는 옵션 클래스입니다.

초기화

let tapOption = Sophonz.TapOption(
    isAutoCapture:             Bool,
    isAutoCaputrueButtonTitle: Bool,
    isAutoCaputrueButtonId:    Bool
)

파라미터 설명

파라미터타입기본값설명
isAutoCaptureBoolfalse탭 이벤트 자동 수집 활성화 여부
isAutoCaptureButtonTitleBooltrue버튼의 Title 텍스트 수집 여부
isAutoCaptureButtonIdBooltrue버튼의 ID 수집 여부

isAutoCapturefalse인 경우, 나머지 옵션 값과 무관하게 탭 이벤트가 수집되지 않습니다.

특정 버튼 수집 제외

button.sophonz_ignore = true

사용 예시

// 자동 수집 활성화, Title 수집 활성화, ID 수집 활성화
let tapOption = Sophonz.TapOption(
    isAutoCapture:             true,
    isAutoCaputrueButtonTitle: true,
    isAutoCaputrueButtonId:    true
)

XHROption 상세

Sophonz.XHROption은 앱 내 HTTP 요청의 Header 및 Body 수집 여부를 제어하는 옵션 클래스입니다.

초기화

let xhrOption = Sophonz.XHROption(
    isCaptureHttpRequestHeader: Bool,
    isCaptureHttpRequestBody:   Bool
)

파라미터 설명

파라미터타입기본값설명
isCaptureHttpRequestHeaderBoolfalseHTTP 요청의 Header 수집 여부
isCaptureHttpRequestBodyBoolfalseHTTP 요청의 Body 수집 여부

XHROption을 설정하지 않으면 XHR 요청 자체는 수집되지만, Header와 Body는 수집되지 않습니다.

Body 수집 시 민감한 개인정보(비밀번호, 토큰 등)가 포함될 수 있으므로, 수집 대상 API를 사전에 검토하고 적용하세요.

사용 예시

// Header, Body 모두 수집
let xhrOption = Sophonz.XHROption(
    isCaptureHttpRequestHeader: true,
    isCaptureHttpRequestBody:   true
)
 
// Header만 수집
let xhrOption = Sophonz.XHROption(
    isCaptureHttpRequestHeader: true,
    isCaptureHttpRequestBody:   false
)

WebviewOption 상세

Sophonz.WebviewOption은 하이브리드 앱에서 Native 세션과 WebView 세션의 연결 방식을 제어하는 옵션 클래스입니다.

초기화

let webOption = Sophonz.WebviewOption(
    isSharedSession: Bool,
    isNeedWebAgent:  Bool
)

파라미터 설명

파라미터타입기본값설명
isSharedSessionBooltrueNative 세션과 WebView 세션을 통합할지 여부
isNeedWebAgentBooltrueSDK가 WebView에 WebAgent 스크립트를 자동 주입할지 여부

isSharedSession: true로 설정하면 Native와 WebView의 사용자 행동이 하나의 세션으로 통합되어 추적됩니다.

isNeedWebAgent: false는 WebAgent 스크립트가 이미 별도로 로드된 경우 중복 주입을 방지하기 위해 사용합니다. 순수 Native 앱에서는 별도 설정이 필요 없습니다.

사용 예시

// 하이브리드 앱 — 세션 통합, WebAgent 자동 주입
let webOption = Sophonz.WebviewOption(
    isSharedSession: true,
    isNeedWebAgent:  true
)
 
// WebAgent를 별도로 로드하는 경우 — 중복 주입 방지
let webOption = Sophonz.WebviewOption(
    isSharedSession: true,
    isNeedWebAgent:  false
)

주요 API

extension Sophonz {
 
    /// SDK 초기화
    @discardableResult
    @objc public static func setup(options: Sophonz.Options,
                                   isDebug: Bool = false) -> Sophonz?
 
    /// SDK 시작
    @objc public func start()
 
    /// 사용자 ID 설정
    @objc public static func setUserId(id: String?)
 
    /// 현재 설정된 사용자 ID 반환
    @objc public static func getUserId() -> String?
 
    /// 커스텀 로그 전송
    @objc public static func customLog(level: Sophonz.LogLevel, message: String)
 
    /// Span에 커스텀 속성 추가
    /// SDK start() 이전에 설정하면 이후 생성되는 모든 Span에 자동 포함됩니다.
    @objc public static func setAttribute(key: String, value: String?)
 
    /// Keychain에 저장된 기기 UUID 반환
    @objc public static func getDeviceId() -> String
 
    /// xib 방식으로 WebView를 초기화한 경우, 스크립트를 수동으로 주입합니다.
    @objc public static func setWebviewConfiguration(
        userContentController: WKUserContentController)
}

API 요약표

API설명
Sophonz.setup(options:isDebug:)SDK 초기화
.start()SDK 시작
Sophonz.setUserId(id:)사용자 ID 설정
Sophonz.getUserId()사용자 ID 조회
Sophonz.customLog(level:message:)커스텀 로그 전송
Sophonz.setAttribute(key:value:)Span에 커스텀 속성 추가
Sophonz.getDeviceId()기기 UUID 조회
Sophonz.setWebviewConfiguration(userContentController:)xib WebView 스크립트 수동 주입

SDK 초기화 예제

Swift 프로젝트 — 기본 예시

AppDelegatedidFinishLaunchingWithOptions에서 아래와 같이 초기화합니다.

import UIKit
import SophonzCore
 
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
 
    var window: UIWindow?
 
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        setupSophonzSDK()
        return true
    }
 
    func setupSophonzSDK() {
        let endpoint   = Sophonz.Endpoints(collectorURL: "https://in.v0.sophonz.com")
        let appKey = "서비스 키"
 
        // SDK 수집 여부를 API 응답으로 제어
        let sdkControl = Sophonz.SDKCollectControl(remoteCollectionControlEnable: true)
 
        // HTTP 요청 Header, Body 수집
        let xhrOption  = Sophonz.XHROption(
            isCaptureHttpRequestHeader: true,
            isCaptureHttpRequestBody:   true)
 
        // Native 세션 공유 (기본값: true)
        let webOption  = Sophonz.WebviewOption(isSharedSession: true)
 
        // 터치 자동 수집, Title 활성화, ID 활성화
        let tapOption  = Sophonz.TapOption(
            isAutoCapture:             true,
            isAutoCaputrueButtonTitle: true,
            isAutoCaputrueButtonId:    true)
 
        let option = Sophonz.Options(
            project:           "namespace",
            appKey:            appKey,
            endpoints:         endpoint,
            deployEnvironment: .production,
            sampleRate:        1.0,
            isDeviceIdEnable:  true,
            sdkCollectControl: sdkControl,
            tapOption:         tapOption,
            xhrOption:         xhrOption,
            webviewOption:     webOption)
 
        // isDebug: true → 콘솔 로그 출력 활성화
        Sophonz.setup(options: option, isDebug: true)?.start()
    }
}

Swift 프로젝트 — 실전 예시

실제 프로젝트에서는 Collector URL, 서비스 키, 네임스페이스를 별도의 매니저 클래스로 관리하는 것을 권장합니다.

func setupSophonzSDK() {
    // Collector URL: 사용자가 선택한 IP를 우선 사용하고, 없으면 기본값으로 폴백
    let endpoint = Sophonz.Endpoints(
        collectorURL: "https://in.v0.sophonz.com"
    )
 
    // API 응답으로 SDK 수집 여부 원격 제어
    let sdkControl = Sophonz.SDKCollectControl(
        remoteCollectionControlEnable: true
    )
 
    // HTTP 요청의 Header 및 Body 수집 활성화
    let xhrOption = Sophonz.XHROption(
        isCaptureHttpRequestHeader: true,
        isCaptureHttpRequestBody:   true
    )
 
    // Native 세션 공유, WebAgent 스크립트 중복 주입 방지
    let webOption = Sophonz.WebviewOption(
        isSharedSession: true,
        isNeedWebAgent:  false
    )
 
    // 탭 이벤트 자동 수집 (Title 수집 활성화, ID 수집 활성화)
    let tapOption = Sophonz.TapOption(
        isAutoCapture:             true,
        isAutoCaputrueButtonTitle: true,
        isAutoCaputrueButtonId:    true
    )
 
    let option = Sophonz.Options(
        project:           "namespace",
        appKey:            appKey,
        endpoints:         endpoint,
        deployEnvironment: .development,
        sampleRate:        1,
        isDeviceIdEnable:  true,
        sdkCollectControl: sdkControl,
        tapOption:         tapOption,
        xhrOption:         xhrOption,
        webviewOption:     webOption
    )
 
    // isDebug: true → 콘솔 로그 출력 활성화
    Sophonz.setup(options: option, isDebug: true)?.start()
}

Objective-C 프로젝트

AppDelegatedidFinishLaunchingWithOptions에서 아래와 같이 초기화합니다.

#import "AppDelegate.h"
#import <SophonzCore/SophonzCore-Swift.h>
 
@implementation AppDelegate
 
- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self setupSophonzSDK];
    return YES;
}
 
- (void)setupSophonzSDK {
    SophonzEndpoints *endpoint =
        [[SophonzEndpoints alloc] initWithCollectorURL:@"https://in.v0.sophonz.com"];
    NSString *appKey = @"서비스 키";
 
    SophonzSDKCollectControl *sdkControl =
        [[SophonzSDKCollectControl alloc] initWithRemoteCollectionControlEnable:YES];
 
    SophonzXHROption *xhrOption =
        [[SophonzXHROption alloc] initWithIsCaptureHttpRequestHeader:YES
                               isCaptureHttpRequestBody:YES];
 
    SophonzWebviewOption *webOption =
        [[SophonzWebviewOption alloc] initWithIsSharedSession:YES];
 
    SophonzTapOption *tapOption =
        [[SophonzTapOption alloc] initWithIsAutoCapture:YES];
 
    SophonzOptions *option = [[SophonzOptions alloc]
        initWithProject:           @"namespace"
        appKey:                    appKey
        endpoints:                 endpoint
        deployEnvironment:         SophonzDeployEnvironmentProduction
        sampleRate:                1.0
        isDeviceIdEnable:          YES
        sdkCollectControl:         sdkControl
        tapOption:                 tapOption
        xhrOption:                 xhrOption
        webviewOption:             webOption];
 
    [[Sophonz setupWithOptions:option isDebug:YES] start];
}
 
@end