Launching AR experiences

SDK Guide

Use the SDK to smoothly transition your users into Variant Launch as needed.

Embed the SDK

Add this script tag as the first item, or as early as possible in your <head>. It should run before your 3D engine code if you want WebXR support available when your other code runs.

<script src=""></script>

The redirect=true means that iOS users will be instantly redirected to the Launch Card for the current page (where they will then open the Launch Viewer and be returned to the page with WebXR support).

You can remove &redirect=true if you want to handle the timing of redirecting iOS users to the Launch card yourself (e.g. if you want to use an explicit 'enter AR' button, or have users view some content on the page before Launching).

Starting a WebXR AR Session

Once you know WebXR is available you can simply use a immersive-ar WebXR session as you normally would in your engine of choice, specifying a local reference space:

navigator.xr.requestSession('immersive-ar', {
  requiredFeatures: ['local', 'anchors', 'dom-overlay', 'hit-test'],

Creating a Launch URL manually

  getLaunchUrl(targetURL): string

If you want to control exactly what page the user will see upon entering the Variant Launch viewer, you can manually create a Launch URL once the SDK has initialized.

For example, you might want to hide the transfer to the viewer behind a 'launch AR' button on your site. Upon tapping the button you redirect the user to the launch URL, and when they tap 'Open' on the appclip, the target URL is loaded in the viewer and starts the WebXR experience immediately without any user input.

var launchUrl = VLaunch.getLaunchUrl('')
window.location.href = launchUrl

Tracking Quality Changes

Listen for the event vlaunch-ar-tracking on the pages document to receive updates about the quality of the ARKit tracking. The states match those in the ARKit Documentation, and can be used to prompt the user on how to resolve the issue, or simply pause/restart the experience.

We recommend you use these events to show UI prompts specific to your experience (e.g. "Point your device at the floor and move side-to-side").

document.addEventlistener('vlaunch-ar-tracking', handleTrackingChanged)

const handleTrackingChanged = (event) => {
  switch (event.detail.state) {
    case 'normal':
      // the tracking is working normally
    case 'not-available':
      // tracking is not running
    case 'limited-excessive-motion':
      // the device is currently moving too fast to track
    case 'limited-initializing':
      // the tracking is still being initialized
    case 'limited-insufficient-features':
      // the tracking is not able to track enough features in the user's environment
    case 'limited-relocalizing':
      // the tracking is currently relocalizing

Initialisation Event

If you want additional information and control, you can listen for the vlaunch-initialized event:

window.addEventListener('vlaunch-initialized', (event) => {
  if (event.detail.launchRequired) {
    //We need to use launch to get WebXR as we're on iOS
    window.location.href = event.detail.launchUrl

Here is the full payload sent with the 'vlaunch-initialized' event as event.detail:

  launchRequired: boolean
  webXRStatus: 'unsupported' | 'launch-required' | 'supported'
  launchUrl: string

launchRequired will be true if the user is on an iOS device where visiting the launch URL will enable WebXR. This value is false if the user is already in the Launch viewer.

webXRStatus reports the WebXR availability on the device. If the result is 'supported' you can immediately launch a standard webXR session without using the launch SDK.

launchUrl contains the Launch URL for iOS users that will open the current page in the Variant Launch viewer. If you wish to open a different URL (e.g. to have the user drop right into WebXR) use getLaunchUrl()

Example projects