English | 한국어
iOS SDK for the ViaLink deep link infrastructure service.
One link routes automatically across iOS, Android, and Web. When the app is not installed, the user is sent to the App Store and still lands on the intended screen on first launch (deferred deep linking). Click, install, open, event, and payment all flow through a single attribution pipeline.
Unlike most deep link and attribution tools, which require a sales call and an annual contract, ViaLink is free to start. No credit card — all six platform SDKs are available the moment you sign up.
Links shared on KakaoTalk, Naver, LINE, Instagram, or Threads open in the app's built-in browser, where Universal Links and App Links often don't fire. ViaLink's link server detects the in-app browser and takes the route that works there:
- KakaoTalk · Naver · LINE (iOS) — hands the link off to Safari automatically, so the Universal Link fires
- Android in-app browsers — launches the app with an
intent://URL, falling back to the store if it isn't installed - Instagram · Facebook · Threads and others — tries your app's custom URL scheme (if registered) and shows an "Open in external browser" guide as a backup
This runs on the link server — no extra SDK code needed.
- Deep link routing — automatic handling of Universal Links / Custom URL Schemes
- Deferred deep linking — fingerprint-based matching on the first launch after install
- Event tracking — batched delivery of custom events
- Payment attribution — records payment attempts and automatically attaches
link_id - Link creation — generate deep links from within the app (static/dynamic)
- iOS 15.0+
- Swift 5.9+
- Xcode 15+
Xcode > File > Add Package Dependencies
URL: https://github.com/aresjoydev/vialink-ios-sdk
import ViaLinkCore
@main
struct iosApp: App {
init() {
ViaLinkSDK.shared.configure(apiKey: "YOUR_API_KEY")
}
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
// Receive a Custom URL Scheme
ViaLinkSDK.shared.handleURL(url)
}
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { userActivity in
// Receive a Universal Link
ViaLinkSDK.shared.handleUniversalLink(userActivity)
}
}
}
}// Receive Universal Links / custom schemes
ViaLinkSDK.shared.onDeepLink { data in
print("path: \(data.path)")
print("params: \(data.params)")
}
// Deferred deep link (matched after the first install)
ViaLinkSDK.shared.onDeferredDeepLink { data, error in
if let error = error {
print("match failed: \(error.message)")
return
}
if let data = data {
print("deferred: \(data.path)")
} else {
print("no match (organic)")
}
}// Synchronous (returns the cached value immediately)
let deepLink = ViaLinkSDK.shared.getDeepLinkData()
let deferred = ViaLinkSDK.shared.getDeferredLinkData()
// Asynchronous (waits until the result arrives)
Task {
let deepLinkAsync = try? await ViaLinkSDK.shared.awaitDeepLinkData() // 3-second timeout
let deferredAsync = try? await ViaLinkSDK.shared.awaitDeferredLinkData() // first launch: waits for the match result / later launches: returns nil immediately
}ViaLinkSDK.shared.track("purchase", data: [
"product_id": "12345",
"revenue": "29900",
"currency": "KRW"
])Task {
do {
let result = try await ViaLinkSDK.shared.payment.initiated(
PaymentInitiatedArgs(
orderId: "ORDER-1234",
amount: 29900,
currency: "KRW",
paymentMethod: "apple_pay"
)
)
print("Success: \(result.success), EventId: \(result.paymentEventId)")
} catch {
print("Payment Error: \(error.localizedDescription)")
}
}Task {
do {
let url = try await ViaLinkSDK.shared.createLink(
path: "/product/12345",
data: ["promo_code": "FRIEND_SHARE"],
campaign: "referral",
linkType: "dynamic" // when click tracking is needed
)
print("created link: \(url)")
} catch {
print("creation failed: \(error.localizedDescription)")
}
}See the runnable Xcode sample project in the sample/ViaLinkSample/ directory.
Proprietary — © 2026 Aresjoy Inc. All rights reserved. Use is governed by the ViaLink Terms of Service. See LICENSE.
