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

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
| Option | Language | Cost to build for visionOS | Same code on phones and Quest |
|---|---|---|---|
| SwiftUI and RealityKit | Swift | Free | Apple platforms only |
| Unity with PolySpatial | C# | Paid Unity Pro, Enterprise or Industry plan | Yes, within Unity |
| ViroReact by ReactVision | TypeScript and React Native | Free, MIT licensed | Yes: 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 prebuild3. 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 inViroScene. - 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