Set up deep linking

Configure iOS Universal Links and Android App Links so installed apps open directly when users tap your smart link.

Set up deep linking

By default, tapping your smart link opens the App Store / Play Store. Once deep linking is configured, installed apps open directly — your user lands inside the app, not on a store page they have to dismiss.

This works via the standard Apple Universal Links and Android App Links protocols. OhLinks serves the required association files automatically, you just need to provide your app's identifiers.

  1. Go to Dashboard → Apps (sidebar, phone icon).
  2. Fill in the form:

iOS section

  • iOS Bundle ID — your app's bundle identifier, e.g. com.yourcompany.yourapp. Find it in Xcode → Signing & Capabilities.
  • iOS Team ID — your Apple Developer Team ID (10-character string, e.g. ABC1234567). Find it in App Store Connect → Membership.

Android section

  • Android Package Name — your app's package, e.g. com.yourcompany.yourapp. It's in your AndroidManifest.xml.
  • Android SHA-256 Fingerprint — your app signing key's SHA-256 fingerprint, in AB:CD:EF:... format (with colons). For a release build:
    keytool -list -v -keystore your-release-key.keystore -alias your-alias
    
  1. Click Save.

OhLinks now serves the association files at:

  • https://oh-links.com/.well-known/apple-app-site-association
  • https://oh-links.com/.well-known/assetlinks.json

(If you use a custom domain, the files are served on that domain too.)

Step 2 — Declare the domain in your app

iOS (Xcode)

  1. Open your project → target → Signing & Capabilities.
  2. Add the Associated Domains capability.
  3. Add an entry: applinks:oh-links.com (or your custom domain).
  4. Build and reinstall the app on a real device (Universal Links don't work in the simulator).

Android (AndroidManifest.xml)

In your launch activity:

<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="oh-links.com" />
</intent-filter>

Replace oh-links.com with your custom domain if you use one.

Step 3 — Verify

Apple's verification can take up to 24h on first install. Once it's working:

  • iOS — long-press the smart link in Notes / Messages. The preview should show "Open in Your App".
  • Androidadb shell pm get-app-links com.yourcompany.yourapp shows verified next to your domain.

What about brand-new installs?

When the user doesn't have your app installed, we send them to the store. After they install and open the app, your app should call:

GET https://oh-links.com/api/v1/resolve/{shortCode}

You'll get back JSON with the original deep link payload (smartLinkId, targetUrl, device) so you can route the user to the right screen — even though they didn't tap your link inside the app.

This is the "deferred deep linking" pattern. Implementation depends on your stack (e.g. read the install referrer on Android, paste the clipboard on iOS, or use a separate attribution SDK).

Troubleshooting

  • Universal Links don't trigger — Check the AASA file is reachable: curl -I https://oh-links.com/.well-known/apple-app-site-association should return 200 application/json. The file is served per-host: if you use a custom domain, make sure that domain is verified in your dashboard.
  • App Links don't trigger — The SHA-256 fingerprint in your dashboard must match the keystore that signed the APK installed on the device. Debug builds use a different keystore than release.