Phase 3 — Apple MatterSupport UI
Layer: Native + Matter Extension (no JS)
System Matter commissioning UI opens (BLE/Wi‑Fi discovery, user picks device, network setup).
Call chain
Matter Extension (RequestHandler)
| Callback | When | What we do |
|---|---|---|
| validateDeviceCredential(_:) | Attestation check | Saves cert declaration + attestation info to App Group |
| selectWiFiNetwork(from:) | Wi‑Fi scan results | Returns .defaultSystemNetwork |
| selectThreadNetwork(from:) | Thread scan results | Returns .defaultSystemNetwork |
| commissionDevice(in:onboardingPayload:commissioningID:) | Apple leg complete | Saves onboarding payload to App Group |
| configureDevice(named:in:) | User names device | Saves device name to App Group |
Class: RequestHandler (extension point com.apple.matter.support.extension.device-setup)
Shared storage: Extension writes via ESPMatterExtLocalStorage; host app reads via ESPMatterEcosystemInfo.shared.getOnboardingPayload() / getDeviceName() after perform() returns.
Apple’s UI handles discovery + network for the Apple fabric leg. RainMaker fabric certs are not installed during this phase.
What could go wrong
User dismisses the system UI → perform() throws → APPLE_COMMISSIONING_FAILED + COMMISSIONING_ERROR. Invalid or expired QR → device not found or pairing fails in MatterSupport. App Group misconfigured → onboarding payload not readable by host app after Apple leg.