Mobile & Native Apps

You can put your configurator inside an iOS, Android, React Native or Flutter app today, with no changes to your project. There are two approaches: embed the published configurator in a web view, or build native interface around it.

Start with the embedThe published share view is already mobile-responsive and is the same runtime your customers use on the web — you get the 3D scene, option logic, pricing, AR and checkout with no feature gaps. Most teams ship this in a day or two.

Option A — Embed the configurator

  1. 1Publish the project and copy the share URL (see Sharing & Embedding).
  2. 2Load that URL in a web view: WKWebView on iOS, WebView on Android, react-native-webview, or webview_flutter.
  3. 3Enable DOM storage. On Android this is OFF by default and the configurator will not render without it.
  4. 4Leave hardware acceleration enabled so WebGL works — the 3D view has no software fallback.
  5. 5Handle the AR hand-off (below) and confirm on a physical device.

Web view settings

SettingNeeded forWhat to do
DOM storageTheme, language and interface stateRequired. Android defaults to off — set domStorageEnabled = true, or the page fails to render.
Hardware accelerationAll 3D rendering (WebGL)Required. Ensure android:hardwareAccelerated is not disabled in your manifest.
File chooserProjects with artwork or image upload optionsAndroid only — implement WebChromeClient.onShowFileChooser, or the upload button does nothing.
Camera permissionWearable AR (face, wrist, body try-on) onlyNot needed for standard "place in your room" AR. The prompt appears when the shopper opens AR, not at launch.
The AR hand-off is the step most integrations missAugmented reality is handed from the page to the operating system, and a web view intercepts that hand-off by default — so without the two hooks below the “View in your space” button appears to do nothing. On Android, catch the intent:// URL in shouldOverrideUrlLoading and start the activity. On iOS, a raw WKWebView does not present AR Quick Look itself — intercept the navigation to the .usdz file and show a QLPreviewController. Neither path works in a simulator, so test on real hardware.

Two more things to handle

SituationWhat to do
CheckoutCompleting a configuration navigates to your Shopify or WooCommerce checkout. Decide whether that stays in the web view, opens a native screen, or opens the system browser. If your platform opens links in a new window, implement onCreateWindow on Android too.
Configurator unavailableIf the account behind the project is inactive, the server responds 402 and a branded "unavailable" card is shown. Leave it visible or show your own message — do not retry in a loop.

Option B — Native interface around the configurator

Keep the web view for the 3D scene and option controls, and draw the surrounding interface natively — navigation, branding, your call to action, cart, account and analytics. The configurator broadcasts three events your app can subscribe to by injecting a small listener script and forwarding to a native bridge (WKScriptMessageHandler on iOS, @JavascriptInterface on Android, onMessage in React Native).

EventFires whenPayload
simplio3d:option.changedA shopper changes a selectable optionblockId, blockName, value, label, type
simplio3d:form.submittedAn enquiry form is submitted successfullyrequestId, formData
simplio3d:quote.submittedSame moment — a semantic aliasrequestId, formData

form.submitted and quote.submitted fire together on the same submission — subscribe to one, or you will double-count. In option.changed, the shape of value depends on type: checkbox options report an array and number inputs report an object of named values, so switch on type rather than assuming a single value.

Embedding on a web page rather than in an app? You do not need to inject a listener at all — a Custom Script already runs inside the share-view document and can forward these same events to the page hosting your iframe with postMessage. See Sharing & Embedding → “Listening to the Configurator from Your Page” for a worked, origin-checked example.

What the events do and don’t coverYour app observes the configurator; configuration state stays owned by the configurator, which is what saves you from re-implementing the option logic, material rules and pricing. To open on a specific configuration, use a saved-configuration permalink (?c=). Driving a selection into the configurator from native code, and event coverage for modular module placement, are not part of the supported interface yet — tell us if you need either and we will extend it.

Which to choose

Option A — EmbedOption B — Native shell
Typical effort1–2 days1–3 weeks
3D, options and pricingConfiguratorConfigurator
Header, navigation, call to actionConfiguratorYour app
Checkout and cartOpens externallyYour app
Analytics and attributionWeb-sideYour app

Option B builds on the same embed as Option A, so starting with A costs you nothing if you later want native chrome. For the underlying endpoints, see the API reference.

More in Integrations