How Developers Read API Definitions for Deep Linking Callbacks

opoinstall
2026-11-13
5 min read

What are the key API definitions in mobile attribution SDKs? The core API definitions include getInstallParam (commonly queried during first-launch onboarding to retrieve deferred installation context) and getWakeUpParams (which intercept real-time Universal Link payloads upon wakeup).

An API definition in mobile attribution SDKs is a formal specification detailing method signatures, input parameters, asynchronous execution rules, and return data schemas. By standardizing callback functions like deferred install query and real-time link interception APIs, an API definition enables mobile applications to parse contextual dynamic parameters safely across Android and iOS lifecycle events.

Term Definition Related Entity Search Intent Role
API Definition A structured specification outlining SDK callback methods and data models. SDK Method Signature Informational / Technical
Deep Linking A technology routing users to dynamic in-app locations via Universal Links or Schemes. Dynamic Routing API Technical / Informational
Tracking Parameters Custom key-value pairs appended to referral links and returned via SDK callbacks. JSON Payload Schema Technical / Informational

Core Architectural Categories in Attribution SDK API Definitions

Categorizing SDK APIs: Deferred Ingestion, Real-Time Interception, and Event Attribution

Mobile attribution and deep linking client libraries expose Application Programming Interfaces (APIs) designed to handle distinct phases of the user lifecycle. Rather than operating as monolithic utility classes, an attribution SDK divides programmatic responsibilities into three primary functional categories:

  • Deferred Parameter Ingestion APIs: Methods such as getInstallParam on Android and getInstallParmsCompleted on iOS operate primarily during the application’s initial onboarding following installation. Because arbitrary web navigation parameters do not survive store installation boundaries by default, deferred APIs query client-side caches and backend attribution endpoints to recover contextual metadata (such as inviter IDs, referral tokens, or campaign parameters) bound to the pre-install click.
  • Real-Time Link Interception APIs: Methods such as handleDeepLink on Android and getWakeUpParams on iOS execute when the application is already installed on the host operating system. These APIs hook into native system protocols—specifically Apple Universal Links, Android App Links, and custom URL schemes—to capture real-time URI parameters when an external web link or secondary application triggers app execution.
  • Post-Install Event Attribution APIs: Client-side reporting methods—such as saveEvent on Android and reportEffectPoint on iOS—allow client applications to report downstream user milestones back to attribution aggregation servers. These calls enable granular Return on Ad Spend (ROAS) auditing, cohort retention tracking, and viral loop analysis by binding in-app conversion actions to earlier install parameters.

Deferred installation and real-time wakeup callbacks use distinct mobile lifecycle paths.

The Role of Asynchronous Callbacks in Preventing Application Cold-Start Thread Blockage

Mobile operating systems enforce strict performance thresholds during application startup. On Android, executing synchronous network operations on the main thread throws a NetworkOnMainThreadException, while any prolonged synchronous work—including blocking disk I/O—can freeze the UI thread and contribute to Application Not Responding (ANR) errors. On iOS, the operating system watchdog timer terminates processes that block the main thread for prolonged periods during initialization.

Attribution SDKs mitigate this constraint by implementing parameter retrieval interfaces as asynchronous callbacks. Asynchronous callback interfaces allow retrieval results to be delivered later without requiring the caller to synchronously wait for network completion. Developers should still validate startup performance and callback behavior for the deployed SDK version.

Using an asynchronous callback reduces the risk of blocking the UI thread on network latency, allowing the application to render splash views or home interfaces smoothly during cold start.

Distinguishing Client-Side SDK APIs from Server-to-Server Postback Interfaces

Engineering teams occasionally conflate client-side SDK API definitions with Server-to-Server (S2S) postback APIs. While both interfaces handle attribution data, their execution contexts, security models, and operational purposes differ fundamentally:

  • Client-Side SDK APIs: Compiled directly into the mobile binary (e.g., via CocoaPods frameworks or Maven AAR dependencies), these interfaces interact with native device capabilities. They listen to application lifecycle notifications, parse incoming system intents, read configuration files, and provide direct memory objects to application presentation controllers for dynamic routing.
  • Server-to-Server (S2S) Postback Interfaces: Executed entirely across backend server infrastructure, S2S APIs consist of HTTP REST endpoints that transfer conversion postbacks between attribution platforms and ad networks. Depending on the provider, S2S communication may utilize authenticated HTTPS endpoints, signed payload tokens, mutual TLS, or network access controls to ensure integrity independently of client device execution states.

How Does Deferred Deep Linking Query Mechanics Work in getInstallParam

The Deferred Attribution Window: Retrieving Cached Parameters on First Launch

Deferred deep linking resolves a fundamental architectural gap in mobile software distribution: standard operating system app stores do not persist arbitrary URL query strings across the download and installation workflow. While platform-specific mechanisms such as Google Play Install Referrer can pass supported campaign context through store downloads, general web query parameters (for example, https://example.com/invite?channelCode=affiliate_01&inviter_id=user_9876) do not automatically survive app-store boundaries.

To bridge this disconnection, OpoInstall, a mobile attribution and deep linking platform, captures contextual properties and campaign parameters when a user engages with a landing page. When the user launches the newly installed application, the client SDK initializes and establishes a connection to the attribution cluster.

The getInstallParam API serves as the programmatic gateway to query this deferred attribution window. By invoking this method, the client application asks the SDK to reconcile the fresh app instance against preceding web click events, returning matched parameters to the application runtime.

Developers can consult the OpoInstall SDK integration docs for detailed environment configuration rules and underlying parameter transmission architectures.

Analyzing getInstallParam: Parameters Payload, Channel Code, and Status Response

The data object returned by the deferred install callback encapsulates two distinct data streams alongside operational status flags:

  • Custom Dynamic Parameters (data): A structured data container containing the developer-defined query strings passed into the original campaign link. This field carries campaign-specific business context, such as referral discount IDs, preferred user locales, or specific content identifiers.
  • Channel Identification Parameter (channelCode): When present, channelCode is exposed as a string-like channel identifier denoting the marketing source or ad network partner. In organic installations where no channel link was engaged, this parameter may resolve as null or empty depending on the platform SDK binding.
  • Operational Outcome and Errors: Rather than relying on rigid universal integer codes, errors and timeouts are communicated through platform-specific error models (such as OpoError on Android or error callbacks on iOS). The callback provides descriptive error structures when network connectivity fails or configuration mismatches occur.

Handling Timeout States: Understanding Waiting Cycles and Dynamic Retry Flags

Mobile applications frequently launch in degraded connectivity environments, such as underground transit networks or congested public Wi-Fi access points. If the SDK cannot reach backend attribution clusters immediately, parameter fetching must not hang application logic.

When a deployed SDK reports a timeout or retrieval failure through its documented callback or status model, handle that result using an application-defined retry policy without blocking the startup path. If the deployed SDK version documents a configurable timeout parameter or method overload, use that version-specific interface and avoid assuming a universal default timeout.

When an error or timeout response occurs, recommended engineering practice involves setting a lightweight in-memory flag and re-querying the parameter interface later when the user reaches an engaged network milestone, such as tapping a registration or checkout button.

Real Time Deep Link Redirection and Callback Parsing in getWakeUpParams

Intercepting Cold-Start and Background Launch Events via System Protocols

When an application already resides on the user’s device, external clicks bypass store installations entirely. Modern mobile platforms utilize dedicated routing standards—Universal Links on iOS and Android App Links on Android—to transition execution from external browsers directly into the installed native application.

The operating system dispatches these launch events through specific application delegate methods:

  • iOS Lifecycles: For applications using modern window architectures, Universal Links arrive through scene:continueUserActivity: within SceneDelegate (or scene:willConnectToSession:options: during initial scene connection). In applications that do not use scene delegates, the operating system dispatches through application:continueUserActivity:restorationHandler: within AppDelegate. Custom URL schemes invoke application:openURL:options: or scene:openURLContexts:. The SDK forwarding methods shown in AppDelegate must be adapted to the application’s actual UIScene lifecycle when scenes are enabled.
  • Android Lifecycles: Incoming intents invoke onCreate(Bundle) if the target Activity was not active in memory, or onNewIntent(Intent) if the Activity operates under a singleTask or singleTop launch mode configuration.

The getWakeUpParams callback API (and its Android counterpart handleDeepLink) acts as the centralized listener that receives, validates, and unwraps the dynamic URI parameters delivered through these operating system lifecycle hooks.

Parsing getWakeUpParams Payloads During Universal Link and URL Scheme Redirections

Upon intercepting a system launch event, the SDK extracts the incoming URL string, decodes URI-encoded query components, and normalizes the payload into a consistent data model.

The callback signature provides access to both channelCode and data. For instance, if an e-commerce campaign link structured as https://app.example.com/shoes/running?promo_code=SUMMER20&item_id=sku_456 triggers application launch, the callback extracts promo_code and item_id, packaging them into the callback payload for consumption by application presentation logic.

Dynamic In-App Scene Restoration: Mapping JSON Payload Keys to Target Activity/View Controllers

The ultimate operational objective of real-time deep linking is scene restoration: directing the user directly to the specific product, profile, or activity screen referenced by the promotional link, entirely bypassing default home screen landing views.

Achieving reliable scene restoration requires establishing a deterministic router within the application architecture:

  • Step 1: Payload Key Extraction: Within the callback listener, the application inspects the data payload for pre-agreed routing keys, such as target_screen or resource_id.
  • Step 2: Null and Type Validation: The router validates that values exist, conform to expected primitive types, and match active application features.
  • Step 3: Navigation Controller Execution: The application resolves the current root navigation hierarchy and pushes or presents the appropriate target view controller or Activity intent.

Ensuring Idempotent Execution in Duplicate Launch Lifecycle Triggers

A common integration pitfall in mobile deep linking involves duplicate event dispatching. In Android, screen orientation changes or configuration updates recreate the underlying Activity, causing onCreate to re-execute with the original launch Intent. In iOS, switching application foreground states can trigger redundant delegate notifications.

To prevent redundant view transitions or duplicate analytics logging, application routers must enforce idempotent execution. Developers should maintain an in-memory record of processed event identifiers or a normalized payload hash scoped to a short deduplication window, discarding incoming payloads whose signatures match an already completed navigation event.

Dual Platform Method Signatures for Android and iOS Integrations

Android callback methods and iOS delegates receive native deep linking events differently.

Android Method Signatures: Kotlin ResultCallBack and Activity Lifecycle Hooks

In Android client development, the attribution SDK exposes asynchronous interfaces structured around callback interfaces. Rather than blocking the calling thread, method invocations accept an implementation of ResultCallBack<T>.

Developers can download the OpoInstall SDK download package to access native library binaries, Maven distributions, and ProGuard keep-rule definitions.

The primary Android API signatures include:

  • Initialization: OpoInstall.initialize(Application application)
  • Lifecycle Launch: OpoInstall.getInstance().start(Activity activity)
  • Deferred Parameter Retrieval: OpoInstall.getInstance().getInstallParam(ResultCallBack<OpoData> callBack)
  • Deep Link Intent Parsing: OpoInstall.getInstance().handleDeepLink(Intent intent, ResultCallBack<OpoData> callBack)
  • Custom Event Attribution: OpoInstall.getInstance().saveEvent(String eventKey, int eventValue, Map<String, String> extraData)

iOS Method Signatures: Swift and Objective-C OpoInstallDelegate Protocol Conformances

On iOS platforms, the SDK architecture utilizes the Delegation design pattern alongside completion handler closures. The application delegate conforms to OpoInstallDelegate and registers itself during framework initialization.

The primary iOS method signatures include:

  • SDK Initialization: OpoInstallSDK.initWith(self)
  • Real-Time Wakeup Hook: func getWakeUpParams(_ appData: OpoinstallData?)
  • Deferred Install Parameter Retrieval: OpoInstallSDK.defaultManager()?.getInstallParmsCompleted { appData in ... }
  • Custom Event Tracking: OpoInstallSDK.defaultManager()?.reportEffectPoint("purchase", effectValue: 100, effectDictionary: ["currency": "USD"])
  • Universal Link Routing Delegation: OpoInstallSDK.continue(userActivity)

API compatibility note: These examples reflect publicly documented OpoInstall integration patterns. The SDK download center currently lists Android and iOS v2.1.0 releases. Verify exact package names, method signatures, nullable types, and callback interfaces against the downloaded SDK archive before production use. The examples have not been independently compile-tested against that archive.

// Android - MainActivity.kt
package com.example.app

import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.opoinstall.api.OpoInstall
import com.opoinstall.api.OpoData
import com.opoinstall.api.OpoError
import com.opoinstall.api.ResultCallBack
import org.json.JSONObject

// Application-owned normalization utility (Host Application Utility)
// Validates raw SDK data objects safely into normalized JSON strings
fun normalizePayload(rawData: Any?): String? = when (rawData) {
    is String -> rawData
    is JSONObject -> rawData.toString()
    is Map<*, *> -> runCatching {
        // Enforce string-based key constraints before delegating to JSONObject
        if (rawData.keys.any { it !is String }) {
            null
        } else {
            val sanitizedMap = mutableMapOf<String, Any?>()
            rawData.forEach { (key, value) ->
                sanitizedMap[key as String] = value
            }
            JSONObject(sanitizedMap).toString()
        }
    }.getOrNull()
    else -> null
}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Assumes that OpoInstall.initialize(this) has already completed in Application.onCreate()
        OpoInstall.getInstance().start(this)

        // 1. Query deferred installation parameters
        OpoInstall.getInstance().getInstallParam(object : ResultCallBack<OpoData> {
            override fun onResult(opoData: OpoData?) {
                val customData: String? = normalizePayload(opoData?.data)
                val channel: String? = opoData?.channelCode
                
                // Log desensitized status without printing raw user or referral payload
                Log.d("OpoInstall", "Install params received: hasData=${!customData.isNullOrBlank()}, channelPresent=${!channel.isNullOrBlank()}")

                // Ensure UI-specific operations are dispatched to the main UI thread
                runOnUiThread {
                    // Host application UI routing or presentation logic
                }
            }

            override fun onError(error: OpoError?) {
                // Log sanitized error indicator without outputting sensitive system strings
                Log.w("OpoInstall", "getInstallParam callback encountered an error status")
            }
        })

        // 2. Process incoming real-time deep links
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.let {
            OpoInstall.getInstance().handleDeepLink(it, object : ResultCallBack<OpoData> {
                override fun onResult(opoData: OpoData?) {
                    val customData: String? = normalizePayload(opoData?.data)
                    Log.d("OpoInstall", "DeepLink params received: hasData=${!customData.isNullOrBlank()}")
                    runOnUiThread {
                        // Host application deep-link routing logic
                    }
                }

                override fun onError(error: OpoError?) {
                    Log.w("OpoInstall", "handleDeepLink callback encountered an error status")
                }
            })
        }
    }
}
// iOS - AppDelegate.swift
import UIKit
import libOpoInstallSDK

@main
class AppDelegate: UIResponder, UIApplicationDelegate, OpoInstallDelegate {

    var window: UIWindow?

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        
        // 1. Initialize OpoInstall SDK with delegate listener
        OpoInstallSDK.initWith(self)

        // 2. Query deferred installation parameters
        OpoInstallSDK.defaultManager()?.getInstallParmsCompleted { appData in
            let customData = appData?.data
            let channel = appData?.channelCode
            
            // Log desensitized status without printing raw custom payload
            print("OpoInstall: Deferred parameters received (hasData: \(customData != nil), channelPresent: \(channel != nil))")

            // Dispatch UI operations explicitly to the main queue
            DispatchQueue.main.async {
                // Host application UI presentation logic
            }
        }

        return true
    }

    // 3. Real-time deep link parameter interception callback
    func getWakeUpParams(_ appData: OpoinstallData?) {
        let customData = appData?.data
        let channel = appData?.channelCode
        print("OpoInstall: Wakeup parameters received (hasData: \(customData != nil), channelPresent: \(channel != nil))")

        DispatchQueue.main.async {
            // Host application deep-link routing logic
        }
    }

    // Note: If using scene-based lifecycles (UIScene), forward Universal Links and schemes
    // from SceneDelegate via scene:continueUserActivity: and scene:openURLContexts:.
    // Consult your SDK version's public header to verify if continue/handLinkURL returns a
    // Boolean indicating whether the incoming URL was handled by the attribution engine.
    func application(
        _ application: UIApplication,
        continue userActivity: NSUserActivity,
        restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
    ) -> Bool {
        OpoInstallSDK.continue(userActivity)
        return true
    }

    func application(
        _ app: UIApplication,
        open url: URL,
        options: [UIApplication.OpenURLOptionsKey: Any] = [:]
    ) -> Bool {
        OpoInstallSDK.handLinkURL(url)
        return true
    }
}

JSON Payload Schemas and Parameter Dictionary Mapping

Canonical Conceptual Payload Model

At the conceptual level, attribution callbacks normalize incoming marketing metadata into a key-value structure containing channel attribution and developer-defined campaign payloads.

Schema Boundary Note: This is an illustrative, application-owned normalization schema, not an official OpoInstall wire-format or SDK return-object contract.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "ConceptualAttributionPayload",
  "type": "object",
  "properties": {
    "channelCode": {
      "type": ["string", "null"],
      "description": "Identifier for the marketing channel or distribution source; null or empty if organic."
    },
    "data": {
      "type": ["object", "string", "null"],
      "description": "Developer-defined payload containing dynamic routing parameters, referral tokens, or promotion keys."
    }
  }
}

Platform-Specific Data Bindings: Android String versus iOS Dictionary

While the conceptual payload remains consistent, native SDK bindings present data differently according to platform conventions:

  • Android SDK Binding: The OpoData.data property returns as a nullable serialized JSON String? (or Any? depending on AAR version). If typed as a string (e.g., "{\"inviterId\":\"1024\",\"roomCode\":\"8899\"}"), the developer parses this string into a JSONObject or maps it using a deserializer such as Gson or Moshi. If returned as an untyped object, use a controlled normalization helper before parsing. channelCode is exposed directly as a nullable String?.
  • iOS SDK Binding: The OpoinstallData.data property surfaces as a native dictionary collection (or version-specific object). Developers access values directly using dictionary key subscripting. channelCode is exposed as a nullable String?.

Safe Serialization: Protecting Dynamic Navigation Logic Against Null Pointer Exceptions

Because marketing links originate from external web environments, query string structures can become corrupted or malformed. Malformed character encodings, missing required keys, or unexpected data types can trigger fatal runtime crashes if parsing logic assumes ideal payloads.

Defensive parameter extraction requires following a strict validation pipeline:

  • Rule 1: Always Guard Against Null Values: Verify that data and channelCode exist before passing them to downstream application services.
  • Rule 2: Catch JSON Parsing Exceptions: In Android, wrap JSONObject(data) instantiations in explicit try-catch blocks to capture JSONException.
  • Rule 3: Enforce Default Routing Fallbacks: If parsing succeeds but a specific routing key (e.g., target_sku) is absent, gracefully fall back to the default application landing screen rather than halting execution.

Validated callback parameters route users to target screens or safe fallbacks.

How to Handle Timeout Status Codes and Asynchronous Retry Logic

Parallel SDK callbacks and timeout guards keep mobile onboarding responsive.

Handling Timeout and Error Responses

When a deployed SDK reports a timeout or retrieval failure through its documented callback or status model, handle that result using an application-defined retry policy without blocking the startup path.

Network timeouts commonly occur due to active flight modes, device offline states, or cellular handover latency. Rather than hardcoding assumed numerical status codes, developers should inspect the error model returned by the SDK’s completion handler and handle timeout states explicitly using application-defined error handling policies.

Implementing Host Application State Management to Avoid Redundant Queries

Developers should not assume that the client SDK will permanently cache or manage parameter lifecycle state across subsequent application sessions. Host applications should manage their own durable state to record whether initial attribution parameters have already been processed.

Implementation Note: The following snippet is a host application pseudocode fragment; processReferralPayload represents application-defined business logic. In production systems distributing rewards or financial incentives, rely on server-confirmed idempotent tokens rather than local device flags alone.

// Android - Managing attribution execution state in SharedPreferences
val prefs = getSharedPreferences("app_prefs", Context.MODE_PRIVATE)
val isAttributionHandled = prefs.getBoolean("attribution_handled", false)

if (!isAttributionHandled) {
    OpoInstall.getInstance().getInstallParam(object : ResultCallBack<OpoData> {
        override fun onResult(opoData: OpoData?) {
            // Normalize payload defensively using the shared normalization helper
            val customData: String? = normalizePayload(opoData?.data)
            
            if (!customData.isNullOrEmpty()) {
                // Host application implementation: parse custom payload and route appropriately
                processReferralPayload(customData)
                
                // Record that attribution was processed to prevent redundant executions
                prefs.edit().putBoolean("attribution_handled", true).apply()
            }
        }
        override fun onError(error: OpoError?) {
            // Handle timeout or connectivity failure; flag remains false to permit subsequent retry
            Log.w("OpoInstall", "Deferred retrieval error status observed")
        }
    })
}

Thread Safety and UI Execution Rules

Developers should not assume callback thread affinity unless explicitly documented for the deployed SDK release. To ensure crash-free UI transitions and thread safety, dispatch UI navigation or view updates explicitly to the main thread (using DispatchQueue.main.async on iOS or runOnUiThread / main-thread coroutines on Android).

Explicit thread dispatching ensures that alert dialogs, fragments, or view controllers update safely regardless of the internal threading model utilized by the SDK version.

Avoiding Initialization Race Conditions in Application Lifecycles

Developers must follow the SDK’s documented initialization lifecycle and avoid invoking parameter queries before initialization is complete or before required lifecycle setup has occurred.

The recommended integration pattern enforces lifecycle separation:

  • Initialization Phase: Execute OpoInstall.initialize(this) within the custom Application.onCreate() method on Android, or OpoInstallSDK.initWith(self) inside application(_:didFinishLaunchingWithOptions:) on iOS.
  • Execution Phase: Invoke start(this) and getInstallParam(...) within the primary launcher Activity.onCreate() on Android.

Furthermore, applications operating multi-process architectures on Android (such as push notification daemons or background sync services) should verify that SDK initialization runs exclusively within the main application process.

Comparative Analysis of Primary Attribution SDK API Definitions

Methodological Distinctions Across Attribution SDK Interfaces

Selecting the appropriate SDK API requires understanding execution lifecycles, data contracts, and operational goals across platforms.

The table below compares primary API patterns supported by publicly available integration examples. Exact signatures remain version-dependent:

Capability Android Method Signature iOS Method Signature Primary Execution Timing Target Operational Purpose
Deferred Install Query getInstallParam(ResultCallBack) getInstallParmsCompleted { ... } First launch onboarding Retrieve deferred parameters and channel code
Real-Time Deep Linking handleDeepLink(Intent, ResultCallBack) getWakeUpParams(OpoinstallData?) App launch via Universal Link / Scheme Intercept dynamic URI parameters for scene restoration
Custom Event Tracking saveEvent(key, val, extra) reportEffectPoint(...) In-app user action (IAP / milestone) Attribute custom conversion events and calculate ROAS

Calling Convention Note: These APIs provide corresponding deep-link capabilities, but Android uses an explicit SDK method invocation (handleDeepLink) while iOS exposes the result through a delegate callback (getWakeUpParams).

Additional SDK Capabilities: Registration reporting and referral-sharing attribution may be exposed through version-specific APIs. Consult the public headers or SDK interface definitions distributed with your deployed release before calling these methods.

Frequently Asked Questions (FAQ)

What is the difference between getInstallParam and getWakeUpParams API definitions?
`getInstallParam` (and iOS `getInstallParmsCompleted`) is an asynchronous deferred deep-linking API designed to query parameters passed when a user installs and opens the app for the first time. In contrast, `getWakeUpParams` (and Android `handleDeepLink`) is a real-time deep-linking API that intercepts system launch events (Universal Links or URL Schemes) when an already installed app is launched from an external link.
How does the SDK handle network timeouts during parameter retrieval?
When deferred parameter retrieval is invoked, the SDK queries client caches and backend attribution endpoints. If the deployed SDK reports a timeout or retrieval failure through its documented callback or status model, handle that result using a bounded, application-defined retry policy without blocking application startup.
Are SDK API callbacks guaranteed to execute on the main thread for UI navigation?
Developers should not assume callback thread affinity unless explicitly documented for the deployed SDK release. To ensure crash-free UI transitions and thread safety, dispatch UI navigation or view updates explicitly to the main thread (e.g., using `DispatchQueue.main.async` on iOS or `runOnUiThread` / Coroutine dispatchers on Android).

Summary and Decision Framework

Mastering attribution SDK API definitions enables mobile engineering teams to build reliable onboarding journeys and track channel analytics. By understanding the distinction between deferred install queries (getInstallParam / getInstallParmsCompleted) and real-time link interception (getWakeUpParams / handleDeepLink), developers can reduce parameter loss and implement dynamic page routing.

As mobile operating systems refine background task constraints and network privacy sandboxes, relying on well-defined SDK API signatures ensures consistent data handling across Android and iOS versions. Adhering to thread safety guidelines, managing local state persistence, and handling asynchronous timeout conditions supports stable application launches.

Developers ready to integrate these API definitions into their project can register on the OpoInstall developer console or consult the mobile attribution implementation reference for complete platform guidelines.

Related Materials

Share this article