Oliver Edis

How to Build for Apple Vision Pro Without a Unity Pro Subscription

Build for Apple Vision Pro Without Unity Pro: one codebase node linked to an Apple Vision Pro and a Meta Quest on a wireframe floor

Short answer: there are three practical ways to build for Apple Vision Pro. Apple's native SwiftUI and RealityKit (free, Swift, Apple platforms only). Unity with PolySpatial, which according to Unity's own documentation requires a Unity Pro, Enterprise, or Industry subscription for the visionOS packages. Or ViroReact, the MIT-licensed React Native renderer, which runs immersive and mixed visionOS apps from the same TypeScript codebase that already ships to iPhone, Android, and Meta Quest.

Your options

OptionLanguageCost to build for visionOSSame code on phones and Quest
SwiftUI and RealityKitSwiftFreeApple platforms only
Unity with PolySpatialC#Paid Unity Pro, Enterprise or Industry planYes, within Unity
ViroReact by ReactVisionTypeScript and React NativeFree, MIT licensedYes: iPhone, Android, Quest, web

When native Swift is the right call

If your app is Apple-only and your team writes Swift, SwiftUI and RealityKit give you the deepest visionOS integration on day one. Choose ViroReact when you also need Android or Quest, when your team is a React team, or when an AI coding agent is doing most of the building.

Build for Vision Pro with ViroReact

The visionOS path is Expo-only for now. You need Xcode with the visionOS SDK, @reactvision/react-viro 3.0 or newer, and @reactvision/react-native-visionos.

1. Add the Expo plugins

{
  "expo": {
    "plugins": [
      "@reactvision/react-viro",
      "@reactvision/react-viro/plugins/withViroVisionOS"
    ]
  }
}

2. Create the visionOS folder and prebuild

npx @react-native-community/cli@latest init MyApp \
  --template @reactvision/visionos-template \
  --directory visionos --skip-install
npm install --save-dev @react-native-community/cli @callstack/out-of-tree-platforms
npx expo prebuild

3. Use the same navigator as Quest

<ViroXRSceneNavigator
  arInitialScene={{ scene: PhoneARScene }}
  vrInitialScene={{ scene: HeadsetScene }}
  visionOSImmersionStyle="mixed"
/>

On Vision Pro the navigator opens an ImmersiveSpace and reads vrInitialScene, so a Quest VR scene usually serves both headsets. mixed shows content over passthrough; full hides passthrough. Input is a pinch, delivered to your scene as the same onClick, hover, and drag events.

Honest limitations today

  • No AR components on visionOS (ViroARScene, planes, image markers). Root headset scenes in ViroScene.
  • Video, audio, camera texture, and object detection are not available on visionOS yet.
  • Custom GLSL shader modifiers do not work on the Metal path.
  • Expo only for now; bare React Native is unverified.

Primitives, text, PBR with image-based lighting, particles, and animations are in good shape on device. The full walkthrough is in Getting started with visionOS and ViroReact.

Let your agent handle the setup

The ReactVision MCP server (https://mcp.reactvision.xyz/viro) knows the current visionOS setup and per-platform support, so your coding agent can tell you which components work on Vision Pro before it writes them.

Next steps

Oli

Frequently asked questions

Do I need Unity Pro to build for Apple Vision Pro?
Only if you build with Unity. Unity's visionOS and PolySpatial packages require a Pro, Enterprise, or Industry plan. Native Swift and ViroReact do not.
Can React Native apps run on Apple Vision Pro?
Yes. With ViroReact 3.0 and the visionOS Expo plugin, React Native apps run immersive and mixed ImmersiveSpace scenes on Vision Pro.
Can one codebase target Vision Pro and Meta Quest?
Yes. ViroXRSceneNavigator serves the same headset scene to Quest (OpenXR) and Vision Pro (visionOS), and an AR scene to phones.