WarpLink
SDKsiOS

iOS SDK

Integrate the WarpLink iOS SDK with Swift Package Manager to add deep linking, deferred deep links, and install attribution.

Requirements: iOS 15+, Swift 5.9+, Xcode 15+. Universal Links require a physical device. They do not work on the iOS Simulator.

Installation

  1. Go to File > Add Package Dependencies...
  2. Enter: https://github.com/WarpLinkApp/warplink-ios-sdk
  3. Select Up to Next Major Version and click Add Package

Configure Associated Domains

  1. In Xcode, select your app target > Signing & Capabilities
  2. Click + Capability > Associated Domains
  3. Add: applinks:aplnk.to

Also enable Associated Domains in your App ID at developer.apple.com.

Serving links from a custom domain? Add an entry for it too (applinks:links.yourapp.com), then declare it to the SDK.

Initialize the SDK

Call configure() as early as possible in your app lifecycle. Pass an onLink callback and the SDK wires up cold start, warm start, and the deferred deep link check automatically. Your one callback receives every resolved link.

The credential below is an SDK key, created in the dashboard under API Keys > SDK key. An API key looks identical but cannot record installs: deep links still resolve, so the integration looks healthy while every attribution call is rejected.

Your onLink callback only fires for a real resolved link or an error. A deferred check that finds no match is not delivered to onLink, so the automatic sink stays quiet when there is nothing to route. Everything is dispatched on the main thread.

Deliver Incoming URLs

The SDK still needs the tapped URL from the OS. Pick one of these (no swizzling):

  • Drop-in delegate: set your scene delegate class to WarpLinkSceneDelegate (or app delegate to WarpLinkAppDelegate) and the SDK forwards Universal Links for you.
  • One-liner: if you keep your own delegate, forward the activity or URL:

That is the entire host integration. Resolution and the onLink dispatch are automatic.

Opt Out of Automatic Handling

Every piece is on by default. Disable what you want to drive yourself:

The SDK always recognizes aplnk.to. If your links are served from a custom domain, tell the SDK which domains are yours. Then a link on that domain resolves on the very first launch, with no network round trip.

This matters because the decision is synchronous. WarpLink.open(_:) returns a Bool the instant the OS hands over a URL, so it can only answer from what it already knows. A domain the SDK has not been told about is reported as not ours and handed back to your router, which is exactly what a fresh install looks like before the SDK has ever reached the server.

Declare them in code:

Or declare them with no code at all, in Info.plist:

Both forms are optional and both are additive. The SDK uses the union of aplnk.to, linkDomains, the WarpLinkDomains array, and the domains it learns from the server, so an app that declares nothing keeps working exactly as before.

Entries are normalized for you: whitespace is trimmed, the value is lowercased, and a full URL is reduced to its host, so https://Links.YourApp.com/ and links.yourapp.com mean the same thing. www. is left alone, because www.yourapp.com and yourapp.com are different hosts.

Cold and warm start are handled for you once URLs reach the SDK. See Deep Links for the delegate options and the manual path.

The deferred check fires automatically from configure() and delivers its result to onLink. See Deferred Deep Links for details and the manual path.

Test on a Physical Device

  1. Build and run on a physical device
  2. Open your test link in Safari (e.g., https://aplnk.to/abc123)
  3. The app should open and trigger the deep link callback
  4. Check Xcode console for [WarpLink] log messages

Universal Links do not work on the iOS Simulator. Always test on a physical device.

Next Steps

On this page