Docs

Platforms

Connect your iOS and Android apps so links open them directly, and let Lander host the verification files.

The Platforms page (in the Build section of the rail, at /{org}/{project}/setup/platforms) is where you tell Lander about your apps. From a few values, Lander generates and hosts the files iOS and Android download to verify that your app may open your short links:

  • https://<your-domain>/.well-known/apple-app-site-association for iOS Universal Links.
  • https://<your-domain>/.well-known/assetlinks.json for Android App Links.

You never upload or edit these files yourself. The same values also decide where people go when the app is not installed.

The page has two tabs, iOS and Android. Each tab label has a green dot once that app is configured. Each tab shows the form on the left and a live preview of the generated file on the right.

Who can change platforms

Owners, admins and developers. Marketers can open the page, but the fields are read only and there is no save button. Platforms are shared by the test and live environments.

iOS

The iOS tab is titled iOS app: "Universal Links open your app directly when it is installed."

Team ID

Required. Your Apple Developer team's identifier: exactly 10 characters, capital letters and digits, for example ABCDE12345. The field upper cases what you type.

Where to find it: sign in at developer.apple.com, open Membership details and copy Team ID. In Xcode you also see it under the target's Signing and Capabilities, next to the team name.

What Lander does with it: combines it with the bundle ID into the app ID (TEAMID.bundle.id) in apple-app-site-association.

Bundle ID

Required. Your app's bundle identifier in reverse DNS form, for example com.acme.shop.

Where to find it: in Xcode, open ios/Runner.xcworkspace, select the Runner target, then General, and copy Bundle Identifier. It is also PRODUCT_BUNDLE_IDENTIFIER in ios/Runner.xcodeproj/project.pbxproj. Use the bundle ID of the build that should open links (for example your release build, not a .dev flavor), or create a separate project for other flavors.

What Lander does with it: see Team ID above. Team ID and bundle ID together mark the iOS app as configured.

App Store ID

Optional. The numeric ID of your app on the App Store, 6 to 12 digits, for example 1234567890.

Where to find it: it is the number after id in your App Store URL, https://apps.apple.com/app/id1234567890. In App Store Connect it is the Apple ID under your app's App Information.

What Lander does with it: when someone on iOS opens a link without having the app, and the link has no iOS fallback URL, Lander redirects them to https://apps.apple.com/app/id<App Store ID>. Without an App Store ID, they go to the link's web fallback instead, or to a Lander landing page when the link has none.

URI scheme

Optional. A custom URL scheme your app also registers, without ://, for example acmeshop for acmeshop:// URLs. Lower case letters, digits, +, . or -, starting with a letter.

What Lander does with it: the iOS "Continue in app" page (an optional deferred deep linking feature) uses it for its "I already have the app, open it" button, because iOS keeps a Universal Link tapped on a page of the same domain in Safari. See Deferred deep linking.

Save

Click Save iOS app. You see "iOS app saved", and the edge cache is refreshed so the new file is served on the next request. To delete the iOS configuration, click Remove. After that the domain answers 404 for apple-app-site-association.

In your app

The preview card lists the two steps for Xcode:

  1. In Xcode, open Signing and Capabilities and add Associated Domains.
  2. Add applinks:<your-domain>, for example applinks:shop-acme.golander.link.

Details, including entitlements and the custom scheme, are in iOS setup.

Android

The Android tab is titled Android app: "App Links open your app directly, no chooser dialog."

Package name

Required. Your app's application ID, for example com.acme.shop.

Where to find it: applicationId in android/app/build.gradle (or build.gradle.kts). If your build adds an applicationIdSuffix for some build types or flavors, use the ID of the build that should open links.

What Lander does with it: writes it as package_name in assetlinks.json, and builds the default Play Store URL from it.

SHA-256 certificate fingerprints

At least one is required. Each is the SHA-256 fingerprint of a certificate your app is signed with: 32 pairs of hex digits separated by colons.

14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5

You can paste the fingerprint with lower case letters, or as 64 hex characters without colons: Lander converts it to the colon separated, upper case form when you leave the field. Click Add fingerprint for another row.

Add every certificate that signs a build you want links to open:

  • The Play App Signing key. If Google Play signs your app (the default for new apps), this is the certificate users' devices actually see.
  • Your upload key, for builds you install directly or distribute outside Play.
  • Your debug key, if you want links to open debug builds while developing.

Where to find them:

Open your app in Google Play Console, go to the App signing page (under App integrity or Setup, depending on your Console layout) and copy the SHA-256 certificate fingerprint of the App signing key certificate. The same page also shows your upload key certificate.

What Lander does with them: lists them as sha256_cert_fingerprints in assetlinks.json. Android only verifies App Links when the certificate of the installed app matches one of them.

Play Store URL

Optional. A full https URL to your app's store listing. When the field is empty and the package name is valid, a Use default button fills in https://play.google.com/store/apps/details?id=<package name>.

What Lander does with it: when someone on Android opens a link without having the app, and the link has no Android fallback URL, Lander redirects them here, adding a referrer parameter so the SDK can recover the link after install (see Deferred deep linking). Any referrer you already put on the URL, for example your own UTM values, is kept. If you leave the field empty, Lander builds the default URL from your package name.

URI scheme

Optional. A custom URL scheme your Android app registers, for example acmeshop. Same format as on iOS.

Save

Click Save Android app ("Android app saved"). Remove deletes the Android configuration, and the domain then answers 404 for assetlinks.json.

In your app

The preview card lists the two steps for AndroidManifest.xml:

  1. Add an intent filter with android:autoVerify="true".
  2. Use scheme https and host <your-domain>, for example shop-acme.golander.link.

Details are in Android setup.

The generated files

The preview on each tab shows the exact file the edge serves, its URL, a Copy file button and a badge: Valid once the required fields are filled in correctly, Incomplete before that. For the values above, the files look like this:

https://shop-acme.golander.link/.well-known/apple-app-site-association
{
  "applinks": {
    "details": [
      {
        "appIDs": ["ABCDE12345.com.acme.shop"],
        "components": [{ "/": "/*" }]
      }
    ]
  }
}

Every path on the domain opens the app.

How the edge serves them:

  • On every verified domain of the project: your default <project>-<org>.golander.link domain and any custom domains. Add each domain you use to Associated Domains and to your intent filter.
  • As application/json with status 200, never through a redirect, because Apple and Google do not follow redirects.
  • With 404 when that platform is not configured.
  • Cached for up to 5 minutes. Saving or removing a platform refreshes the edge right away. If the refresh fails, the toast says the edge may serve the previous version for a few minutes.

You can check a file yourself:

curl -i https://shop-acme.golander.link/.well-known/apple-app-site-association
curl -i https://shop-acme.golander.link/.well-known/assetlinks.json

Check your setup with the Debugger

The Debugger (Build section, G D) checks everything between a tap and your app's screen. Paste a short link (or just a slug, which uses your default domain) and click Check. Your three newest links are offered under Try as one click samples. The URL you checked is kept in the page URL, so you can share the result.

The checks come in four groups:

GroupChecks
LinkDomain belongs to this project, Link exists (and is in the environment you are viewing), Link is enabled (not disabled or expired)
App configurationiOS app configured, Android app configured, Fallbacks set
Domain files on the edgeapple-app-site-association served (and lists your TEAMID.bundle.id), assetlinks.json served (lists your package with matching fingerprints), Edge resolves the link
SDKSDK seen in the last 24 hours in the current environment

Each check passes, fails, warns or is skipped, and failing checks come with a button that takes you to the fix, such as Add iOS app or Edit link. A summary at the top reads "Everything checks out", "Works, with 1 warning" or "2 checks failed".

Some results worth knowing:

  • apple-app-site-association served or assetlinks.json served fails with a 404 even though the app is configured: save the platform again to refresh the edge, or check that the domain points at Lander.
  • Fallbacks set warns when a platform has no fallback: "People without the app see the Lander landing page."
  • SDK seen in the last 24 hours fails until an app in this environment has called Lander.initialize.

The Debugger checks Lander's side. If every check passes and links still open the browser, look at your app's entitlements and manifest, and remember that the operating system verifies domains when the app is installed. iOS setup, Android setup and Troubleshooting cover the app side.

Next steps

On this page