SDKiOS

Info.plist setup (iOS)

Required Info.plist keys for the Extentos iOS SDK — the Meta DAT auth callback URL scheme, external accessory protocol, background modes, and Bluetooth / camera / microphone / speech privacy strings. generateConnectionModule emits them all.

The Extentos iOS SDK rides on the Meta Wearables Device Access Toolkit (DAT). DAT pairs your phone app with Meta Ray-Ban glasses over an external-accessory channel and hands the auth callback back to your app through a custom URL scheme. iOS gates every one of those mechanisms behind an Info.plist declaration, so the keys below are required for the SDK to reach the glasses through DAT.

Voice apps need almost none of this. A voice-only app reaches its microphone and speaker through the phone's own Bluetooth audio routing, never through DAT — so it needs no MWDAT dict, no Meta App ID, no URL scheme, and none of the accessory keys. It needs the privacy strings its capabilities imply (NSMicrophoneUsageDescription, NSSpeechRecognitionUsageDescription) and, for background listening, UIBackgroundModes: ["audio"]. It also needs the two Extentos keys below — EXTENTOS_APP_ID and EXTENTOSProjectKey — which are not Meta keys: the project key is how a debug build on a real phone authenticates to the managed gateway, so an assistant app without it fails with AssistantError.NoApiKey. Everything else on this page is the camera/display set. See choose your path.

You don't have to add these by hand. generateConnectionModule(platform: "ios") (agent-driven path) emits a complete, ready-to-use Info.plist as a generated file — you apply it verbatim (like the bootstrap), and the same file works on the simulator and on real glasses. (iOS has no manifest merge, so the SDK package can't supply these keys itself — the scaffold owns the file instead.) This page documents what it writes and why, so you can audit the result or wire an app manually.

The Info.plist requirements below are stable and verified against the current source. Package install: Install.

Required keys

KeyPurpose
MWDAT (dict)Meta Wearables DAT configuration. Holds the DAT integration settings the toolkit reads at startup.
MWDATDAMEnabledSet explicitly in every apptrue only if your capability footprint includes Display. Meta's default when the key is missing is true, and DAM runs an on-glasses DWA readiness probe on DAT 0.8 that reaps the device session ~10 s after start on glasses without the DWA app (every current non-display model) — so a camera/audio app with the key missing or true loses its session on real hardware. generateConnectionModule emits the correct value from your declared capabilities.
CFBundleURLTypesRegisters your app's custom URL scheme so DAT can deliver the auth callback after the user authorizes the glasses. This is a custom scheme, not a universal link.
LSApplicationQueriesSchemesMust include fb-viewapp so the app can hand off to the Meta View / AI app during pairing.
UISupportedExternalAccessoryProtocolsMust include com.meta.ar.wearable — the External Accessory protocol the glasses speak. Without it iOS won't surface the device to the app.
UIBackgroundModesbluetooth-central, bluetooth-peripheral, and external-accessory — keeps the accessory session alive when the app isn't foregrounded. Add audio as well if your assistant must keep listening while the app is backgrounded — the scaffold does not emit it, because it depends on your app's behaviour rather than its capabilities. A voice-only app needs audio and none of the other three.
NSCameraUsageDescriptionCamera privacy string — required for photo / video / frame capture.
NSMicrophoneUsageDescriptionMicrophone privacy string — required for audio capture and voice.
NSBluetoothAlwaysUsageDescriptionBluetooth privacy string — the glasses connect over Bluetooth.
NSSpeechRecognitionUsageDescriptionSpeech-recognition privacy string — required for on-device transcription via SFSpeechRecognizer. See requestSpeechRecognitionAuthorization.
EXTENTOS_APP_IDThe Extentos project identity — the generated bootstrap reads it into config.appId. Decoupled from the store bundle id, so Android and iOS apps whose store ids differ can share one Extentos project.
EXTENTOSProjectKeyThe account-bound project key — the SDK's gateway auth reads it as the dev-tier Bearer token on non-simulator debug builds.
NSAppTransportSecurityA loopback-only exception (localhost / 127.0.0.1) so the debug auto-bind probe can reach the MCP localhost bridge over HTTP. Release builds never hit the probe.

Why each one

MWDAT and the custom URL scheme (CFBundleURLTypes). Pairing leaves your app, authorizes in Meta's app, and returns. DAT delivers that return through your registered custom scheme — your app catches it in .onOpenURL and forwards it via glasses.handleUrl(_:). A universal link will not work here; DAT expects a custom scheme.

LSApplicationQueriesSchemes: fb-viewapp. iOS blocks canOpenURL / cross-app handoff to schemes you haven't declared. Pairing needs to reach the Meta app, so fb-viewapp must be listed.

UISupportedExternalAccessoryProtocols: com.meta.ar.wearable. The glasses are an MFi external accessory. iOS only exposes accessories whose protocol string the app has declared — omit this and the device is invisible to the SDK.

UIBackgroundModes. A live glasses session (an open accessory channel over Bluetooth) has to survive the app backgrounding. The scaffold declares bluetooth-central, bluetooth-peripheral, and external-accessory so the connection doesn't drop when the user looks away from the phone.

Privacy strings. iOS hard-crashes an app that touches the camera, microphone, Bluetooth, or speech recognition without the matching NS…UsageDescription. Each Extentos capability maps to one:

  • Camera capture / video / frames → NSCameraUsageDescription
  • Audio capture, speak, voice → NSMicrophoneUsageDescription
  • Any glasses connection → NSBluetoothAlwaysUsageDescription
  • glasses.audio.transcriptions() (on-device STT) → NSSpeechRecognitionUsageDescription

Write copy that names your feature, e.g. "Used to capture photos from your Meta Ray-Ban glasses." The reviewer and the user both read these.

See also