WebXR application life cycle
In this guide, we'll get a birds-eye view of what's involved in creating and driving a WebXR application, without diving down to the code level in detail. This serves as preparation for the next few articles in these WebXR guides, which cover starting up and shutting down a WebXR session, geometry, simulating cameras, spatial tracking, and more.
Life cycle outline
Most applications using WebXR will follow a similar overall design pattern:
-
Check to see if the user's device and browser are both capable of presenting the XR experience you want to provide.
- Make sure the WebXR API is available; if
navigator.xr
is undefined, you can assume the user's browser and/or device doesn't support WebXR. If it's not supported, disable any user interface used to activate XR features and abort any attempts to enter XR mode. - Call
navigator.xr.isSessionSupported()
, specifying the WebXR experience mode you want to provide:inline
,immersive-vr
, orimmersive-ar
, in order to determine whether or not the type of session you wish to provide is available. - If the session type you want to use is available, provide the appropriate interface to the user to allow them to activate it.
- Make sure the WebXR API is available; if
-
When the user requests the activation of WebXR functionality by engaging with the user interface enabled above, request an
XRSession
using the desired mode. This is done by callingnavigator.xr.requestSession()
, again specifying the string indicating the mode you want to enable:inline
,immersive-vr
, orimmersive-ar
. -
If the promise returned by
requestSession()
resolves, use the newXRSession
to manage the WebXR session for the duration of the WebXR experience. This will involve managing inputs, animations, and rendering.- Call the
XRSession
methodrequestAnimationFrame()
to schedule the first frame render for the XR device. - If your scene is complex, you should consider creating a
Worker
—or using one that you've previously created for this purpose—to perform the computations needed for each frame to be rendered. This will reduce the chance that the rendering process will noticeably stall the app. - Each
requestAnimationFrame()
callback should use the information provided about the objects located in the 3D world to render the frame using WebGL. - Each time the callback is invoked, it should call
requestAnimationFrame()
again in order to let the browser know that the callback needs to be run again when it's time to render the next frame.
- Call the
-
When the time comes (such as when the user exits your app or navigates away from your site), end the XR session; otherwise, continue the loop until the user chooses to exit XR mode.
- To end the XR session yourself, call
XRSession.end()
. - Include a handler for the
XRSession
eventend
event to be informed when the session is ending, regardless of whether your code, the user, or the browser initiated the termination of the session.
- To end the XR session yourself, call