Noughty Tours iOS SDK
NoughtyToursSDK is a capture SDK. It drives the device that produces a
virtual tour: LiDAR structure capture, panorama capture, local storage, and
background upload to the Noughty Reality platform.
It vends its capture screens as view controllers you push onto your own
navigation stack, and reports what the user did through a single onEvent
closure per screen. It is not a viewer and it does not render finished tours.
The SDK owns the domain (property → floor → room → panorama scan), the capture runtimes, local storage, and sync. You own navigation, your login, and your chrome.
Requirements
| Platform | iOS 17+ |
| Devices | A real device with a LiDAR scanner for anything that captures or syncs — check NoughtyTours.isDeviceSupported before offering capture |
| Architectures | arm64 only: device and Apple-silicon simulator slices |
| Capabilities | App Attest on your own App ID, plus NSCameraUsageDescription |
| Backend | A pk_ios_* publishable key issued to your app by The Noughty Fox |
| Localization | en, de, ro, ru — the screens localize themselves; there is no string-override hook |
Shape of the API
One NoughtyTours instance for the whole process, built from a Configuration
and started once at launch. Everything else hangs off it.
| Area | Symbols |
|---|---|
| Core | NoughtyTours, Configuration, APIEnvironment |
| Host-provided | OrganizationProviderType, SettingsProviderType, RecordingResolution, PanoramaProcessing, FloorPlanStyle, UIVersion |
| Screens | properties |
| Events | PropertyFlowEvent |
| Handles | Property, Floor |
| Progress | PropertyStatus, SyncState, statusUpdates(for:) |
| Errors | NoughtyToursError, AuthError, NoughtyToursEntity |
| Diagnostics | Log, LogLevel, LogCategory |
Authentication
Device attestation, not tokens you mint. The device attests against your App ID
using Apple's App Attest, scoped to an organisation your app supplies through
OrganizationProviderType. Nothing syncs until attestation succeeds.
See App Attest.
What this SDK does not do
- It has no opinion about your users. There is no login here. You
authenticate your users your own way and hand the SDK only the selected
organisation, through
OrganizationProviderType. The SDK's own auth is device-level and separate. - It stores no settings. It never touches
UserDefaults; every knob comes from you throughSettingsProviderType. - It presents nothing over your UI — no alerts, no modals over your stack.
It navigates only below the entry screen you placed. Failures arrive through
an
onEventfailedcase or are thrown asNoughtyToursError. - It is offline-first. Capture never blocks on connectivity; uploads and sync are additive and happen in the background.
Pages
| Page | Content |
|---|---|
| Installation | Swift Package Manager, deployment target |
| App Attest | Capability setup, device auth, revoking a session |
| Getting started | Providers, start(), placing the first screen |
| Screens | The two entry points, and the flow inside them |
| Events and handles | PropertyFlowEvent, and Property / Floor |
| Progress and sync | PropertyStatus, SyncState, background upload |
| Errors | NoughtyToursError, AuthError |
| Logging | Log, LogLevel, LogCategory |
| Release notes | What changed in each release |