writeup

sidecar decía que el wi-fi de mi ipad estaba apagado. era icloud.

kisnner obando · septiembre de 2026 · macos 27 / ipados 27 · código y evidencia

diálogo de macos: sidecar no puede conectarse de forma inalámbrica porque el wi-fi de tu ipad no está disponible

cómo rastreé SidecarErrorDomain -203 en macos 27 desde un diálogo engañoso hasta un solo bit de bluetooth, y de ese bit al estado de confianza del llavero de icloud del ipad. sin parches, sin tocar sip, sin modificar procesos de apple: solo logs, un framework privado leído desde una pequeña sonda y mucha medición.

resumen

cadena de causas, desde el inicio de sesión de icloud hasta el error -203

entorno

macMacBookPro17,1 (m1, 2020), macos 27.0 26A5425a, luego 27.2 beta 1 26B5086k
ipadiPad13,10 (ipad pro de 12,9", 5.ª gen), ipados 27.0 24A435, luego 27.2 24B5084k
redel mismo wi-fi de casa, mac en 5 ghz canal 44 todo el tiempo
cable usbsidecar siempre funcionó

el problema apareció el 6 de septiembre con macos 27.0. pasé dos días en el lado del mac, restablecí los ajustes de red del ipad (empeoró: el cable también dejó de funcionar hasta reconstruir la confianza) y me rendí. volví el 21 de septiembre con otro enfoque: dejar de adivinar, construir una sonda y medir.

1. el error nunca toca la red

el log del mac en un intento fallido:

SidecarRelay: Connecting to IDS <ipad> 'com.apple.sidecar.display'
SidecarRelay: Open Session Failed: SidecarErrorDomain (-203)
SidecarDisplayAgent: Encountered unrecoverable error: SidecarErrorDomain Code=-203 "SidecarErrorDeviceWiFiNotEnabled"

25 ms entre la primera y la segunda línea. no se puede abrir una sesión de red y fallarla en 25 ms: es una comprobación local.

el error viene de /usr/libexec/SidecarRelay (swift, arm64e). en la build 26B5086k una sola instrucción carga el código: mov x2, #-0xcb en 0x100046908. se llega por tbz w22, #0x0, 0x100046900, desde un bloque que enmascara las banderas del dispositivo (and + cmp/ccmp) y, cuando no coinciden, llama a String.hasPrefix para elegir entre dos errores. el binario también trae las cadenas RapportStatusFlags, WiFiP2P, WiFiOff, WiFiHostAP, iWiFi, ForceAWDL y ForceUSB.

no decodifiqué del todo qué significa cada máscara. lo que puedo decir del desensamblado es que la decisión es una comprobación de banderas. cuál importa lo salió de medir, abajo.

2. medir la bandera

SidecarCore es un framework privado. su SidecarDisplayManager expone sharedManager, devices, connectToDevice:withConfig:completion: y una propiedad status en cada SidecarDevice. esa propiedad es la máscara de estado de rapport que el ipad anuncia por bluetooth. el mismo número aparece en sharingd como SF 0x… y en SidecarRelay como Device Changed <…>.

escribí sidecar-probe, una pequeña herramienta en swift que carga el framework, lee esa propiedad, la imprime una vez por segundo y puede disparar la misma llamada de conexión que usa el menú de pantallas. eso convirtió "sidecar está roto" en algo que podía observar:

statusbanderassidecar inalámbrico
0x880102BLE DuetSync Owner ApplePayfalla, -203
0x880302BLE DuetSync WiFiP2P Owner ApplePayconecta

un solo bit: 0x200, WiFiP2P. por usb el ipad anuncia iWiFi … USB y el bit no hace falta, por eso el cable siempre funcionó.

esto también explica un detalle confuso: universal control abría conexiones awdl (apple wireless direct link) con el mismo ipad mientras sidecar se negaba. rapportd levanta awdl bajo demanda con eventos NeedsAWDL e ignora dispositivos "que no tienen las banderas esperadas". universal control pasa por una ruta forzada (ForceAWDL). sidecar no.

así que la pregunta pasó de "por qué sidecar está roto" a "por qué el ipad no anuncia WiFiP2P".

3. el bit apareció solo

con la sonda corriendo, a las 03:06:45 el ipad pasó de BLE DuetSync Owner ApplePay a BLE DuetSync WiFiP2P Owner ApplePay … MultiUserDevice. sidecar conectó a las 03:10. a las 04:07 el ipad se reinició para instalar una actualización, el bit desapareció otra vez y sidecar volvió a -203.

eso me dio una ventana con el bit y otra sin él. cada conexión exitosa cayó dentro de la ventana con el bit, y cada fallo fuera de ella.

línea de tiempo del bit WiFiP2P y los intentos de sidecar

quien usa el ipad recordó que hacia las 03:06 una alerta de icloud pidió el código del ipad y luego el del iphone. esa fue la primera pista real.

4. el ipad dice por qué

el mac solo ve el resultado. el ipad conoce la razón, así que saqué sus logs por cable:

sudo log collect --device-udid <UDID> --last 10h --output /tmp/ipad.logarchive

1,1 gb. en sharingd (SDNearbyAgentCore), cada ~100 ms:

WiFiP2P bit is not set, WiFi state: Connected, hostAP: NO, NearbyAction scan: on, Manatee: NO

el ipad decide con cuatro entradas: estado del wi-fi, si es un punto de acceso, si el escaneo de nearby action está activo y si manatee está disponible. tres estuvieron bien toda la noche. lo único negativo fue Manatee: NO.

periodoWiFi statehostAPscanManateebit
horas antes de las 03:06ConnectedNOonNOno
03:06:45 a 04:07ConnectedNOondisponiblesí
tras el reinicioConnectedNOonNOno

esta línea también descartó, desde el punto de vista del propio ipad, dos cosas en las que perdí días: el wi-fi (Connected) y el punto de acceso personal (hostAP: NO).

5. por qué manatee estaba caído

manatee es la capa de cifrado de extremo a extremo del llavero de icloud y otros datos protegidos. depende de que el dispositivo sea de confianza en el círculo de confianza octagon de la cuenta. los logs del ipad mostraron toda la cadena:

y el momento en que se arregló, al milisegundo:

03:06:37  securityd  new syncing policy (views include Manatee)
03:06:40  securityd  updated account trust state: TRUSTED      (.134)
03:06:40  sharingd   Manatee is available                      (.119)
03:06:40  rapportd   Error flags changed: 0x100 < NoManatee > -> 0x0
03:06:45  mac        ipad starts advertising WiFiP2P
03:06:52  settings   RenewCredentials no longer pending

6. reproducirlo

una correlación de un solo evento es una historia. quería que la cadena se rompiera y se curara otra vez.

callejones sin salida

cada uno se probó y el fallo continuó. lo que mató cada hipótesis fue una medición, no un argumento.

hipótesispor qué es falsa
wi-fi, bluetooth o awdl caídos en el macwi-fi en 5 ghz, bluetooth encendido, awdl0 arriba; el mac lee WiFiP2P de otro dispositivo; universal control abre awdl con este mismo ipad
punto de acceso personal en el ipadel ipad registra hostAP: NO en cada línea
vpnapagada en ambos, sin cambio
2,4 vs 5 ghzipad en 5 ghz, mismo ssid que el mac: bit ausente en 75 de 75 lecturas de un segundo
versiones distintas del sistemaconectó con ipad 27.0 y mac 27.2; falló con ambos en 27.2
cargadorconectó con el ipad desenchufado; falló enchufado durante más de 20 min
estado viejo en el macreinicié rapportd, sharingd, SidecarRelay, identityservicesd: vuelve el mismo 0x880102 en vivo desde el ipad
restablecer los ajustes de red del ipadempeoró
reiniciar el ipadno lo arregla; la cuenta vuelve a pedir credenciales y el bit se pierde

el arreglo

en el ipad:

  1. ajustes → tu nombre. si pide actualizar los ajustes de la cuenta de apple o volver a iniciar sesión, termínalo (contraseña, código de verificación, códigos de los dispositivos si los pide).
  2. icloud → contraseñas y llavero debe estar activado.
  3. si no basta, cierra sesión de la cuenta de apple y vuelve a iniciarla.

para confirmar: ./sidecar-probe status debe reportar WiFiP2P presente y salir con 0, y ./sidecar-probe connect debe conectar.

lo que no sé

lo que me llevo

apple podría arreglarlo con poco: cuando el ipad retiene WiFiP2P por NoManatee, el diálogo podría decir "inicia sesión en icloud en tu ipad" en lugar de "activa el wi-fi".

archivos

los datos personales (correo de la cuenta, identificadores de cuenta, udid, direcciones) están enmascarados en cada extracto. los logs sin procesar no se publican.