Skip to content
Tolinku
Tolinku
Sign In Start Free
Deep Linking · · 6 min read

Deep Linking for AR and VR Applications

By Tolinku Staff
|
Tolinku industry trends dashboard screenshot for deep linking blog posts

AR and VR apps deal with spatial content: 3D models, scenes, environments, and anchored objects. Deep linking into these apps means not just opening a screen, but placing the user in a specific spatial context. A deep link to an AR furniture app should open with the selected sofa already loaded and ready to place in the room.

This guide covers deep linking patterns for AR and VR across Apple's visionOS/ARKit, Google's ARCore, and standalone VR platforms. For the foundational deep linking standards, see deep linking standards in 2026.

Person wearing VR headset experiencing virtual reality Photo by Eren Li on Pexels

AR Deep Linking on iOS (ARKit + RealityKit)

Apple supports AR content through Quick Look, which lets users view 3D models in their environment directly from a web link:

<!-- Web page with AR deep link -->
<a rel="ar" href="sofa-model.usdz">
  <img src="sofa-preview.jpg" alt="Modern Sofa - View in AR">
</a>

When a user taps this link on an iOS device, the 3D model opens in Quick Look AR mode. No app required. This is the simplest form of AR deep linking.

For app-specific AR experiences, use Universal Links to open the AR scene in your app:

class ARSceneController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        guard let url = navigationContext?.deepLinkURL else { return }
        let pathComponents = url.pathComponents

        // /ar/furniture/modern-sofa → load sofa model in AR
        if pathComponents.contains("ar"), pathComponents.count >= 3 {
            let category = pathComponents[2] // "furniture"
            let modelSlug = pathComponents[3] // "modern-sofa"
            loadARModel(category: category, slug: modelSlug)
        }
    }

    func loadARModel(category: String, slug: String) {
        let modelURL = ModelCatalog.url(for: slug)
        let anchor = AnchorEntity(plane: .horizontal)
        let model = try? ModelEntity.load(contentsOf: modelURL)
        anchor.addChild(model ?? ModelEntity())
        arView.scene.anchors.append(anchor)
    }
}

AR deep links can include spatial parameters:

/ar/furniture/modern-sofa                    → Load model in default placement
/ar/furniture/modern-sofa?color=navy         → Load with specific color variant
/ar/furniture/modern-sofa?scale=0.8          → Load at 80% scale
/ar/room/living-room?layout=open-concept     → Load a room configuration

AR Deep Linking on Android (ARCore)

Scene Viewer

Google's Scene Viewer is the Android equivalent of Apple Quick Look. It renders 3D models in AR without requiring your app:

<!-- Intent URL for Scene Viewer -->
<a href="intent://arvr.google.com/scene-viewer/1.0?file=https://yourapp.com/models/sofa.glb&mode=ar_preferred&title=Modern+Sofa&link=https://yourapp.com/products/modern-sofa#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;end;">
  View in AR
</a>

The link parameter in the Scene Viewer intent is a deep link back to your app or web page. When the user taps the title in Scene Viewer, they go to your product page.

For custom AR experiences in your own app:

class ARActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val uri = intent.data ?: return
        // https://yourapp.com/ar/products/modern-sofa?variant=navy
        val productSlug = uri.pathSegments.lastOrNull() ?: return
        val variant = uri.getQueryParameter("variant")

        arViewModel.loadModel(productSlug, variant)
    }
}
<activity android:name=".ARActivity"
    android:exported="true">
    <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="yourapp.com"
              android:pathPrefix="/ar/" />
    </intent-filter>
</activity>

VisionOS and Spatial Computing

Apple Vision Pro runs visionOS, which supports Universal Links the same way iOS does. The difference is in how you present the content:

// visionOS app: handle deep link to open a volumetric window
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication,
                     continue userActivity: NSUserActivity,
                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        guard let url = userActivity.webpageURL else { return false }

        if url.pathComponents.contains("3d-model") {
            let modelSlug = url.lastPathComponent
            openVolumetricWindow(for: modelSlug)
            return true
        }

        return false
    }

    func openVolumetricWindow(for modelSlug: String) {
        // Open a volumetric window showing the 3D model
        // Users can walk around it in their physical space
    }
}

Deep links can open full immersive spaces on visionOS:

@main
struct MyVRApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }

        ImmersiveSpace(id: "vrScene") {
            VRSceneView()
        }
    }
}

// Handle deep link to open immersive space
func handleDeepLink(_ url: URL) {
    if url.path.hasPrefix("/vr/") {
        let sceneId = url.lastPathComponent
        openImmersiveSpace(id: "vrScene", value: sceneId)
    }
}

URL Structure for AR/VR Content

AR experiences:
  /ar/{category}/{model-slug}              → AR view of a specific model
  /ar/{category}/{model-slug}?color=blue   → AR view with parameters
  /ar/scan/{scene-id}                      → AR scene with anchored content

VR experiences:
  /vr/spaces/{space-slug}                  → Virtual space/environment
  /vr/tours/{tour-slug}                    → Virtual tour
  /vr/events/{event-slug}                  → Virtual event

3D content:
  /3d/{model-slug}                         → 3D model viewer (non-AR)
  /3d/{model-slug}.usdz                    → Direct model download (Apple)
  /3d/{model-slug}.glb                     → Direct model download (Android)

Web Fallback Pages for AR Content

The web page for an AR deep link should include:

  1. Product images (2D fallback for the 3D model).
  2. AR launch button (opens AR on supported devices).
  3. Product details (for SEO and non-AR users).
  4. 3D model metadata for structured data:
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "3DModel",
  "name": "Modern Sofa - Navy",
  "contentUrl": "https://yourapp.com/models/modern-sofa-navy.glb",
  "encodingFormat": "model/gltf-binary",
  "associatedMedia": {
    "@type": "ImageObject",
    "contentUrl": "https://yourapp.com/images/modern-sofa-navy.jpg"
  }
}
</script>

AR Experience Sharing

When a user finds a product they like in AR, let them share the experience:

func shareARExperience(model: ARModel, placement: ARPlacement?) {
    var components = URLComponents(string: "https://yourapp.com/ar/\(model.category)/\(model.slug)")

    // Include current configuration
    var queryItems: [URLQueryItem] = []
    if let color = model.selectedColor {
        queryItems.append(URLQueryItem(name: "color", value: color))
    }
    if let scale = placement?.scale {
        queryItems.append(URLQueryItem(name: "scale", value: String(scale)))
    }
    components?.queryItems = queryItems.isEmpty ? nil : queryItems

    guard let url = components?.url else { return }

    let activityVC = UIActivityViewController(
        activityItems: [url],
        applicationActivities: nil
    )
    present(activityVC, animated: true)
}

The recipient gets a deep link that opens the same AR experience with the same model and configuration.

For virtual events, the deep link should include timing information:

https://yourapp.com/vr/events/product-launch-2026?start=2026-07-15T18:00:00Z

If the event has not started, show a countdown. If it is live, join immediately. If it is over, show a recording.

Cross-Platform Considerations

Model Format Compatibility

Different platforms support different 3D formats:

Platform Preferred Format Fallback
iOS/visionOS USDZ GLTF
Android GLB/GLTF OBJ
Web (WebXR) GLTF/GLB OBJ
Meta Quest GLB/GLTF FBX

Your deep link handler should detect the platform and serve the appropriate format:

// Web page: detect platform and offer the right AR experience
function getARLink(modelSlug) {
  const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
  const isAndroid = /Android/.test(navigator.userAgent);

  if (isIOS) {
    return `/models/${modelSlug}.usdz`; // Quick Look
  } else if (isAndroid) {
    return `intent://arvr.google.com/scene-viewer/1.0?file=https://yourapp.com/models/${modelSlug}.glb&mode=ar_preferred#Intent;scheme=https;package=com.google.android.googlequicksearchbox;end;`;
  } else {
    return `/3d/${modelSlug}`; // Web 3D viewer
  }
}

Tolinku routes deep links to AR/VR content across platforms. Configure routes like /ar/:category/:slug in the Tolinku dashboard, and Tolinku handles platform detection, app-installed vs. not-installed routing, and web fallback pages with AR launch buttons.

For more on deep linking trends, see the future of mobile deep linking. For wearable deep linking, see deep linking for wearables.

Get deep linking tips in your inbox

One email per week. No spam.

Ready to add deep linking to your app?

Set up Universal Links, App Links, deferred deep linking, and analytics in minutes. Free to start.