Skip to main content
Version: 4.6.1

iOS Agent API Reference

Complete reference for NetFUNNEL 4 iOS Agent functions, delegates, and response formats.


Overview

The NetFUNNEL iOS Agent provides a comprehensive API for implementing traffic control in iOS applications. This reference covers all available functions, delegate methods, and configuration options.


Core Functions

Initialize Agent

Initializes the NetFUNNEL agent with configuration parameters.

Netfunnel.initialize(
clientId: String,
delegate: NetfunnelDelegate,
networkTimeout: NSNumber?,
retryCount: NSNumber?,
printLog: NSNumber?,
useNetfunnelTemplate: NSNumber?,
errorBypass: NSNumber?,
userId: String?,
useNetworkRecoveryMode: NSNumber?
)

Parameters:

ParameterTypeRequiredDefaultDescription
clientIdString-Client ID from NetFUNNEL console
delegateNetfunnelDelegate-Delegate object implementing protocol
networkTimeoutNSNumber (Long)3000Network timeout (ms), Min: 100, Max: 10000
retryCountNSNumber (Int)0Retry attempts, Min: 0, Max: 10
printLogNSNumber (Bool)falseEnable debug logging
useNetfunnelTemplateNSNumber (Bool)trueUse waiting room templates from Console
errorBypassNSNumber (Bool)falseBypass on error
userIdStringN/AValue for White/Black-list matching
useNetworkRecoveryModeNSNumber (Bool)falseKeep waiting room open during network issues

Basic Control Functions

Start Basic Control

Starts Basic Control for entry speed limiting.

Netfunnel.shared.nfStart(projectKey: String, segmentKey: String)

Parameters:

ParameterTypeRequiredDescription
projectKeyStringProject key for Basic Control in Console
segmentKeyStringSegment key for Basic Control in Console

Stop Basic Control

Stops Basic Control and returns the entry key.

Netfunnel.shared.nfStop(projectKey: String, segmentKey: String)

Parameters:

ParameterTypeRequiredDescription
projectKeyStringProject key for Basic Control
segmentKeyStringSegment key for Basic Control

Section Control Functions

Start Section Control

Starts Section Control for concurrent user management.

Netfunnel.shared.nfStartSection(projectKey: String, segmentKey: String)

Parameters:

ParameterTypeRequiredDescription
projectKeyStringProject key for Section Control in Console
segmentKeyStringSegment key for Section Control in Console

Stop Section Control

Stops Section Control and returns the section key.

Netfunnel.shared.nfStopSection(projectKey: String, segmentKey: String)

Parameters:

ParameterTypeRequiredDescription
projectKeyStringProject key for Section Control
segmentKeyStringSegment key for Section Control

Utility Functions

Get Version

Returns the NetFUNNEL iOS Agent version.

let version = Netfunnel.shared.getVersion()

Return Value:

TypeDescription
StringNetFUNNEL Agent version string

Delegate Protocol

The NetfunnelDelegate protocol defines callback methods for handling NetFUNNEL events.

Required Methods

nfSuccess

Called when user successfully passes the queue.

func nfSuccess(projectKey: String, segmentKey: String, statusCode: Int, message: String)

Parameters:

ParameterTypeDescription
projectKeyStringProject key
segmentKeyStringSegment key
statusCodeIntStatus code (200, 300, 303)
messageStringSuccess message

Status Codes:

CodeScenario
200Passed the queue; access allowed
300Subscription/license expired; Project/Segment disabled; errorBypass = true with error
303Request from IP/ID in Whitelist (admin bypass)

nfError

Called when a system error occurs.

func nfError(projectKey: String, segmentKey: String, statusCode: Int, message: String)

Parameters:

ParameterTypeDescription
projectKeyStringProject key
segmentKeyStringSegment key
statusCodeIntStatus code (500)
messageStringError message

Status Codes:

CodeScenario
500Start called without initialize; invalid keys; segment deleted; partial server response

nfNetworkError

Called when a network error occurs.

func nfNetworkError(projectKey: String, segmentKey: String, statusCode: Int, message: String)

Parameters:

ParameterTypeDescription
projectKeyStringProject key
segmentKeyStringSegment key
statusCodeIntStatus code (1001, 1002)
messageStringNetwork error message

Status Codes:

CodeScenario
1001Network disconnected (Wi-Fi/Cellular off)
1002Network timeout; invalid HTML URL; server down (e.g., 502)

Optional Methods

nfBlock

Called when user is blocked.

func nfBlock(projectKey: String, segmentKey: String, statusCode: Int, message: String)

Status Codes:

CodeScenario
301Segment blocked in Console (benevolent block)
302Request from IP/ID in Blacklist; BotManager Basic enabled (malicious block)

nfClose

Called when user closes the waiting room.

func nfClose(projectKey: String, segmentKey: String, statusCode: Int, message: String)

Status Codes:

CodeScenario
495Post-waiting room: close button clicked
496Pre-waiting room: close button clicked
497Macro-block room: close button clicked
498Block room: close button clicked
499Default waiting room: cancel button clicked

nfContinue

Called when using custom waiting UI (useNetfunnelTemplate = false).

func nfContinue(projectKey: String, segmentKey: String, statusCode: Int, message: String, aheadWait: Int, behindWait: Int, waitTime: String, progressRate: Int)

Parameters:

ParameterTypeDescription
projectKeyStringProject key
segmentKeyStringSegment key
statusCodeIntStatus code (201)
messageStringContinue message
aheadWaitIntNumber of users ahead in queue
behindWaitIntNumber of users behind in queue
waitTimeStringEstimated wait time
progressRateIntProgress percentage (0-100)

Status Codes:

CodeScenario
201When useNetfunnelTemplate = false (custom waiting UI in use)

nfComplete

Called when key return to server completes.

func nfComplete(projectKey: String, segmentKey: String, statusCode: Int, message: String)

Status Codes:

CodeScenario
200Successfully returned entry key to server
500Failed to return entry key to server

Best Practices

1. Always Use Main Queue for UI Updates

func nfSuccess(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
DispatchQueue.main.async {
// UI updates here
self.updateUI()
}
}

2. Implement All Required Delegate Methods

class ViewController: UIViewController, NetfunnelDelegate {
// Required methods
func nfSuccess(projectKey: String, segmentKey: String, statusCode: Int, message: String) { }
func nfError(projectKey: String, segmentKey: String, statusCode: Int, message: String) { }
func nfNetworkError(projectKey: String, segmentKey: String, statusCode: Int, message: String) { }

// Optional methods (implement as needed)
func nfBlock(projectKey: String, segmentKey: String, statusCode: Int, message: String) { }
func nfClose(projectKey: String, segmentKey: String, statusCode: Int, message: String) { }
func nfContinue(projectKey: String, segmentKey: String, statusCode: Int, message: String, aheadWait: Int, behindWait: Int, waitTime: String, progressRate: Int) { }
func nfComplete(projectKey: String, segmentKey: String, statusCode: Int, message: String) { }
}

3. Handle Errors Gracefully

func nfError(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
// Log error for debugging
print("NetFUNNEL Error: \(statusCode) - \(message)")

// Proceed with original logic for service availability
DispatchQueue.main.async {
self.proceedWithOriginalLogic()
}
}

4. Return Keys Promptly

// Basic Control - return key immediately after action
private func performAction() {
// Action logic
actionService.performAction { [weak self] result in
// Return key immediately after action completes
Netfunnel.shared.nfStop(projectKey: "project", segmentKey: "segment")
}
}

// Section Control - return key when entire section completes
private func completeSection() {
// Section completion logic
sectionService.completeSection { [weak self] result in
if result.success {
// Return key when section fully completes
Netfunnel.shared.nfStopSection(projectKey: "project", segmentKey: "segment")
}
}
}

5. Use Descriptive Project/Segment Keys

// ✅ Good: Descriptive keys
Netfunnel.shared.nfStart(projectKey: "ecommerce_app", segmentKey: "checkout_protection")

// ❌ Bad: Generic keys
Netfunnel.shared.nfStart(projectKey: "project1", segmentKey: "segment1")

Error Handling

Common Error Scenarios

Error TypeStatus CodeCauseSolution
System Error500Invalid keys, segment deletedCheck console configuration
Network Error1001No internet connectionEnable network recovery mode
Network Error1002Server timeout/downCheck server status
Block301Segment blockedCheck segment activation
Block302User in blacklistCheck user status

Error Recovery Strategies

func nfNetworkError(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
switch statusCode {
case 1001: // Network disconnected
// Show offline message, enable network recovery mode
showOfflineMessage()
case 1002: // Network timeout/server down
// Show retry option, check server status
showRetryOption()
default:
// Log unknown network error
print("Unknown network error: \(statusCode)")
}
}

Performance Considerations

1. Minimize Delegate Method Overhead

// ✅ Good: Efficient delegate implementation
func nfSuccess(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
DispatchQueue.main.async { [weak self] in
self?.handleSuccess()
}
}

// ❌ Bad: Heavy operations in delegate
func nfSuccess(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
// Heavy operations should be moved to separate methods
performHeavyOperation()
updateDatabase()
sendAnalytics()
}

2. Use Weak References

class ViewController: UIViewController, NetfunnelDelegate {
func nfSuccess(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
DispatchQueue.main.async { [weak self] in
self?.handleSuccess()
}
}
}

3. Optimize Key Return Timing

// ✅ Good: Return key at optimal time
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
Netfunnel.shared.nfStop(projectKey: "project", segmentKey: "segment")
}

// ❌ Bad: Return key too early
override func viewDidLoad() {
super.viewDidLoad()
Netfunnel.shared.nfStop(projectKey: "project", segmentKey: "segment") // Too early!
}

Debugging

Enable Debug Logging

Netfunnel.initialize(
clientId: "{{CLIENT_ID}}",
delegate: self
)

Monitor Network Requests

Use Xcode's Network Inspector or tools like Charles Proxy to monitor NetFUNNEL requests:

  • Start requests: Look for requests to NetFUNNEL server
  • Key return requests: Look for nfStop/nfStopSection requests
  • Timeout extension: Look for 5003 requests (Section Control)

Common Debug Scenarios

IssueDebug Steps
Waiting room doesn't appearCheck Limited Inflow = 0, segment activation
Key not returnedVerify nfStop/nfStopSection called
App crashes in delegateCheck UI updates on main queue
Network errorsEnable printLog = true, check connectivity