Skip to main content

iOS 퀵 가이드

NetFUNNEL iOS 에이전트를 처음 도입하는 개발자가, 최단 시간 안에 시작할 수 있도록 필수적인 사항들을 간결하게 안내합니다.


1. 디렉터리 구조

이후 단계에서 구현할 NetFUNNEL 적용 샘플의 기본 디렉터리 구조입니다. 각 파일은 에이전트 초기화, 시작/종료 콜백 처리, UI 흐름 제어를 담당합니다.

Project Root/
├── netfunnel/
│ └── NetfunnelHandler.swift // Start and end callback handling (nfContinue, nfSuccess, nfComplete, etc.)

├── views/
│ ├── ContentView.swift // nfStart call - entry request (Splash role)
│ ├── EventView.swift // nfStop call - entry completion handling
│ └── CustomWaitingView.swift // Custom waiting room view definition

└── SampleApp.swift // @main struct - agent initialization call

2. 초기화

NetFUNNEL iOS 에이전트는 앱 전역에서 안정적인 동작을 위해, 앱의 진입 시점에서 초기화되어야 합니다.

  • SwiftUI: @main 구조체의 init()에서 초기화를 수행합니다.

  • UIKit: AppDelegateapplication(_:didFinishLaunchingWithOptions:)에서 초기화를 수행합니다.

SampleApp.swift
import SwiftUI
import Netfunnel_iOS

@main
struct SampleApp: App {
init() {
let agent = Netfunnel.shared
agent.initialize(
clientId: "{CLIENT_ID}",
delegate: NetfunnelHandler.shared // Set the delegate to a specified delegate object or 'self'.
)
}

var body: some Scene {
WindowGroup {
ContentView()
}
}
}

3. 델리게이트

시작 델리게이트는 대기실 시작 이후, nfSuccess, nfContinue, nfError 등의 델리게이트가 호출됩니다.

종료 델리게이트는 대기실 종료 이후, 서버로 진입 키 반납이 완료되면 nfComplete 델리게이트가 호출됩니다.

NetfunnelHandler.swift
import Foundation
import Netfunnel_iOS

class NetfunnelHandler: NSObject, NetfunnelDelegate {

static let shared = NetfunnelHandler()

// MARK: - Required callback closures (Must be defined)
var onSuccess: ((String, String, Int, String) -> Void)?
var onError: ((String, String, Int, String) -> Void)?
var onNetworkError: ((String, String, Int, String) -> Void)?

// MARK: - Optional callback closures (Define as needed)
var onContinue: ((String, String, Int, String, Int, Int, String, Int) -> Void)?
var onBlock: ((String, String, Int, String) -> Void)?
var onClose: ((String, String, Int, String) -> Void)?
var onComplete: ((String, String, Int, String) -> Void)?

private override init() {}

// MARK: - NetfunnelDelegate Methods

func nfSuccess(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
NSLog("nfSuccess \(statusCode) \(message)")
onSuccess?(projectKey, segmentKey, statusCode, message)
}

func nfError(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
NSLog("nfError \(statusCode) \(message)")
onError?(projectKey, segmentKey, statusCode, message)
}

func nfNetworkError(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
NSLog("nfNetworkError \(statusCode) \(message)")
onNetworkError?(projectKey, segmentKey, statusCode, message)
}

func nfContinue(projectKey: String, segmentKey: String, statusCode: Int, message: String,
aheadWait: Int, behindWait: Int, waitTime: String, progressRate: Int) {
NSLog("nfContinue \(statusCode) \(message)")
onContinue?(projectKey, segmentKey, statusCode, message, aheadWait, behindWait, waitTime, progressRate)
}

func nfBlock(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
NSLog("nfBlock \(statusCode) \(message)")
onBlock?(projectKey, segmentKey, statusCode, message)
}

func nfClose(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
NSLog("nfClose \(statusCode) \(message)")
onClose?(projectKey, segmentKey, statusCode, message)
}

func nfComplete(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
NSLog("nfComplete \(statusCode) \(message)")
onComplete?(projectKey, segmentKey, statusCode, message)
}
}

4. 시작 함수

nfStart(기본 제어), nfStartSection(구간 제어)은 대기 상태를 확인하고 필요 시 대기실을 띄우기 위한 함수입니다.

ContentView.swift
import SwiftUI
import Netfunnel_iOS

struct ContentView: View {
@State private var showEventView = false

private let projectKey = "{CLIENT_ID}"
private let segmentKey = "{SEGMENT_KEY}"

var body: some View {
if showEventView {
AnyView(EventView(projectKey: projectKey, segmentKey: segmentKey))
} else {
AnyView(
VStack {
Spacer()
Text("Splash")
.font(.largeTitle)
.padding()
Spacer()
}
.onAppear {
// Callback configuration
NetfunnelHandler.shared.onSuccess = { (projectKey, segmentKey, statusCode, message) in
showEventView = true
}
NetfunnelHandler.shared.onError = { (projectKey, segmentKey, statusCode, message) in
showEventView = true
}
NetfunnelHandler.shared.onNetworkError = { (projectKey, segmentKey, statusCode, message) in
showEventView = true
}

// Waiting room entry (start function call)
Netfunnel.shared.nfStart(projectKey: projectKey, segmentKey: segmentKey)
}
)
}
}
}

5. 종료 함수

nfStop(기본 제어), nfStopSection(구간 제어)은 대기 완료 후 서버에 진입 키를 반납합니다.

진입 키를 서버에 반납하여 다음 사용자가 진입할 수 있도록 하며, 일반적으로 서비스 진입 직후 실행합니다.

Event.swift
import SwiftUI
import Netfunnel_iOS

struct EventView: View {
let projectKey: String
let segmentKey: String

var body: some View {
VStack {
Spacer()
Text("Event")
.font(.largeTitle)
.padding()
Spacer()
}
.onAppear {
// End waiting room when entering event page (end function call)
Netfunnel.shared.nfStop(projectKey: projectKey, segmentKey: segmentKey)
}
}
}