Two iPhones in the same room. User A places an AR object on the table. User B sees the same object on the same table, in the same position — in real time. No QR codes, no markers, no prior calibration. We implement such synchronization using Cloud Anchors — a technology where the anchor is created locally, uploaded to the cloud, and other devices download and localize relative to it. Our team has 5+ years of AR development experience and has successfully deployed such solutions in 15+ projects, including quests, training, and industrial tasks.
Which Technology to Use: ARCore or ARKit?
The choice depends on your target audience and use case.
ARCore Cloud Anchors — a cross-platform solution. Works on iOS via the ARCore SDK for iOS and on Android natively. Anchors are stored on Google servers, with a TTL from 1 day to 365 days depending on settings.
Anchor creation:
// iOS, ARCore SDK
let anchor = garSession.createAnchor(at: transform)
garSession.hostCloudAnchor(anchor, ttlDays: 30) { cloudAnchorId, error in
// cloudAnchorId — string, pass to other participants via your backend
}
Anchor resolution on another device:
garSession.resolveCloudAnchor(cloudAnchorId) { anchor, error in
// anchor.transform — position in world space of this device
}
Apple Shared AR via ARKit + MultipeerConnectivity — works only between Apple devices, no external server. Devices exchange ARWorldMap directly over local network. Limitation: requires one "host" that saves the map and distributes it to participants.
| Characteristic | ARCore Cloud Anchors | ARKit MultipeerConnectivity |
|---|---|---|
| Platforms | iOS, Android | iOS only |
| External server | Required (Google Cloud) | Not required |
| Maximum distance | Any (via internet) | Local network |
| Anchor TTL | 1–365 days | Session only |
| Positioning error | 1–15 cm | 1–5 cm (good conditions) |
For production cross-platform apps — ARCore Cloud Anchors. For Apple-only and offline scenarios — MultipeerConnectivity. ARCore Cloud Anchors can speed up session deployment by 3x compared to ARKit MultipeerConnectivity thanks to cloud infrastructure. More details in the Google ARCore documentation.
What Problems Arise in Multi-User AR?
Scene state synchronization. Cloud Anchor provides a common coordinate system. But data about who placed what, where they moved, what was deleted — that's your layer. A real-time channel is needed: Firebase Realtime Database, Supabase Realtime, or a custom WebSocket. Typical scheme: event objectPlaced(anchorId, modelId, transform) → broadcast to all participants → each applies locally. Latency over LTE: 150–300 ms, acceptable for most games.
Drift between devices. Two iPhones localize relative to the Cloud Anchor independently. Positioning error is 1–5 cm in good lighting. Under poor lighting or low-texture surfaces — up to 10–15 cm. Acceptable for gaming; not for industrial tasks (equipment marking, assembly).
Anchor resolution time. resolveCloudAnchor can take 2–10 seconds while the device collects enough feature points to match the cloud anchor. During this time, you must show the state GARCloudAnchorState.taskInProgress and prevent user interaction. We improve UX with loading animations and pre-localization.
API limits. Google Cloud Anchors: 1,000 free resolve operations per day, then paid. With an active audience, this limit is hit quickly — plan ahead. Our engineers help design an architecture that minimizes resolutions and reduces cloud costs. For example, with 8 simultaneous participants and 5 anchors per session, the 1,000-resolve budget allows about 25 sessions per day. Proper TTL configuration reduces repeated resolve operations by up to 30%.
Cross-Platform AR Multiplayer Architecture
Device A (iOS/Android)
→ creates Cloud Anchor → gets cloudAnchorId
→ sends cloudAnchorId to backend (REST/WebSocket)
Backend (Firebase / custom server)
→ stores cloudAnchorId + session metadata
→ broadcasts events to participants
Device B (iOS/Android)
→ receives cloudAnchorId
→ resolveCloudAnchor → builds common coordinate system
→ receives events → applies changes locally
Case study: AR quest in a shopping mall, 8 simultaneous participants. ARCore Cloud Anchors at points of interest (entrance, department, checkout). Each anchor is a task with a virtual object. Synchronization via Firebase Realtime Database: event "player X found object Y" → object disappears for all. Latency between event and update across all participants is 150–300 ms over LTE. We guarantee stable operation under any lighting conditions.
Common Implementation Mistakes
- Ignoring timeouts during anchor resolution — app freezes.
- No drift handling — objects "drift apart".
- Transmitting large models in real-time — latency and packet loss.
- Incorrect TTL configuration — anchors deleted prematurely.
What's Included
- Integration of ARCore SDK for iOS or configuration of MultipeerConnectivity for Apple-only.
- Creation and resolution of Cloud Anchors with error handling and timeouts.
- Implementation of real-time scene state synchronization.
- UI for statuses: waiting for participants, resolving anchor, desync.
- Testing with real devices under varying lighting conditions.
- Performance optimization for target devices.
- Assistance in choosing optimal TTL and anchor resolution strategy to minimize costs.
Timelines
| Scenario | Timeline |
|---|---|
| Apple-only via MultipeerConnectivity | 2–3 weeks |
| Cross-platform via ARCore Cloud Anchors | 4–6 weeks |
| Full AR multiplayer with state sync | 6–10 weeks |
Pricing is calculated individually after discussing architecture requirements and target audience.
To discuss your project, contact us — get a consultation on architecture and timeline estimate. Order development, and we'll propose the optimal solution for your needs.







