# SDK Methods Reference
Complete reference for all public methods and types in the Positive User iOS SDK.
# UserSDK
# Initialization
UserSDK(
application: UIApplication,
apiKey: String,
baseURL: String,
shouldTrackActivities: Bool
)
Creates the SDK instance and stores it as UserSDK.default. Call once in application(_:didFinishLaunchingWithOptions:).
# Static properties
| Property | Type | Description |
|---|---|---|
UserSDK.default | UserSDK? | Shared SDK instance. Set automatically on init. |
UserSDK.inAppAlertCloseButtonText | String | Label for the close button on in-app messages. Default: "Close". Set before initializing the SDK. |
# Instance properties
| Property | Type | Description |
|---|---|---|
apiKey | String | Read-only. The API key provided at initialization. |
baseURL | String | Read-only. The base URL provided at initialization. |
userId | String? | Read-only. The Positive User-generated user identifier. Available after the first successful ping(). |
notificationDelegate | RemoteNotificationDelegate? | Receives push notification tap events. |
fontResolver | FontResolving? | Provides custom fonts for in-app messages. |
inAppNotificationClickDelegate | InAppNotificationClickDelegate? | Intercepts button taps in in-app messages. |
# Contact methods
# ping()
func ping(_ completion: ((Bool, Error?) -> Void)? = nil)
Creates or updates the contact profile with current device data. Call this to start an anonymous session or after updating contact attributes.
# setUserData(_:_:)
func setUserData(_ userData: [UserDataKey: String?], _ completion: ((Bool, Error?) -> Void)? = nil)
Sets standard contact attributes and calls ping(). Pass nil for a key to remove a previously set value.
UserDataKey values:
| Case | Field sent |
|---|---|
.firstName | first_name |
.lastName | last_name |
.email | email |
.phone | phone |
.userId | user_id |
# setCustomUserData(_:_:)
func setCustomUserData(_ userData: [String: Any?], _ completion: ((Bool, Error?) -> Void)? = nil)
Merges custom attributes into the contact profile and calls ping(). Pass nil for a key to remove a previously set value.
# logout(_:)
func logout(_ completion: ((Bool, Error?) -> Void)? = nil)
Clears all stored contact data and creates a new anonymous session. Local data is wiped immediately regardless of network state.
# Event methods
# sendEvent(with:params:_:)
func sendEvent(with name: String, params: [String: Any], _ completion: ((Bool, Error?) -> Void)? = nil)
Sends a custom event. Requires an identified contact - call ping() first.
# sendProductEvent(_:eventType:name:productURL:params:_:)
func sendProductEvent(
_ productId: String,
eventType: EventType,
name: String? = nil,
productURL: String? = nil,
params: [String: Any]? = nil,
_ completion: ((Bool, Error?) -> Void)? = nil
)
Sends a product event. Requires an identified contact.
EventType cases: .addToCart, .purchase, .liking, .addToObservation, .order, .reservation, .return, .view, .click, .detail, .add, .remove, .checkout, .checkoutOption, .refund, .promoClick
See Product Events for the full reference.
# trackScreen(with:_:)
func trackScreen(with name: String, _ completion: ((Bool, Error?) -> Void)? = nil)
Records a screen visit. Requires an identified contact.
# Notification methods
# registerForRemoteNotifications(options:notificationDelegate:)
func registerForRemoteNotifications(
options: UNAuthorizationOptions,
notificationDelegate: RemoteNotificationDelegate? = nil
)
Requests push notification permission and registers the device with FCM.
# handleNotification(userInfo:)
func handleNotification(userInfo: [AnyHashable: Any])
Forwards a notification payload to the SDK. Call from application(_:didReceiveRemoteNotification:fetchCompletionHandler:) in your AppDelegate to handle background notification taps.
# Protocols
# RemoteNotificationDelegate
protocol RemoteNotificationDelegate {
func didReceiveRemoteNotification(with id: String, data: [AnyHashable: Any])
}
Called when a contact taps a push notification. Fires for both Positive User notifications and all other FCM notifications.
# InAppNotificationClickDelegate
protocol InAppNotificationClickDelegate: AnyObject {
func inAppNotificationDidClick(url: URL) -> Bool
}
Called when a contact taps a button in an in-app message. Return true to handle the URL yourself, false to let the SDK open it in the browser.
# FontResolving
@objc protocol FontResolving {
func resolveFontFor(name: String, size: CGFloat) -> UIFont?
}
Provides custom font instances for in-app message rendering. Return nil to fall back to the system font.
# TrackableView
protocol TrackableView {
var screenName: String { get }
}
Implemented by UIViewController by default (using the class name). Override screenName to provide a custom value.
# Trackable view controllers
Ready-made base classes that call trackScreen automatically in viewDidLoad:
| Class | Extends |
|---|---|
TrackableViewController | UIViewController |
TrackableTableViewController | UITableViewController |
TrackableCollectionViewController | UICollectionViewController |
TrackablePageViewController | UIPageViewController |
TrackableSplitViewController | UISplitViewController |
# NotificationExtensionHelper
Used in a Notification Service Extension to attach images to push notifications.
NotificationExtensionHelper.shared.fillNotificationContent(
_ content: UNMutableNotificationContent?,
contentHandler: @escaping (UNNotificationContent) -> Void
)
See Push Notifications for the full setup.