iOS: on a non-English Simulator, the `Open in` launch confirmation can be answered only by tapping coordinates: `alert accept` refuses its label and reads refuse the app that is not running
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- ios, typescript
- Área
- cli, mobile-dev
Línea de trabajo
Start with RunnerAlertButtonChoice.swift, launch-confirmation.ts, and the alert command handling to trace how button labels are matched and how launch confirmations are detected. Read the related guidance in commands.md and inspect the APP_NOT_RUNNING refusal and alert tests. Done means a caller can select a uniquely matching button by its exact label on a system alert while the app is stopped, with missing or duplicate labels refused and the relevant guidance updated.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
On an iOS simulator set to a non-English language, the Open in “<App>”? launch confirmation that open --launch-url raises cannot be answered with any agent-device command except a press at screen coordinates:
openreports it as expected:launchConfirmation: "unanswered",launchConfirmationReason: "alert-unrecognized", and a warning that says to answer it withalert accept.commands.mdgives the same step for "a non-English Simulator".alert acceptrefuses it withALERT_BUTTON_NOT_FOUND, because the button label (Ouvririn French) is not in the English label list. This refusal is intended since #3715.- The documented way to answer an alert with unrecognized labels, "read the labels with
alert get, then press the button by label throughsnapshot+press @ref" (commands.md), does not work either: the confirmation keeps the app from starting, andsnapshotandfindrefuse withAPP_NOT_RUNNING. Their hint again says to answer withalert accept.
So every step that the warning, the hints and the docs give ends in a refusal. The agent can continue only if it takes a screenshot, reads the button position, and taps the coordinates.
We do not ask alert accept to guess a localized button. We agree with the reason in #3715: a guessed tap can record a permission. We ask for a way to name the button explicitly (see Suggested fix).
Environment
- agent-device 0.21.30.
RunnerAlertButtonChoice.swift,launch-confirmation.tsand theAPP_NOT_RUNNINGrefusal are the same in 0.21.31 and onmain(b08b5e7). On 0.21.29, one run gave the sameopen,alert acceptandfind textresults (snapshot -iwas not run). - macOS 26.6.2, Xcode 27.1, Node 24.22.1.
- New iPhone 17e simulator on iOS 27.0, language
fr-FRand localefr_FR(defaults write -g AppleLanguages/AppleLocale, then a reboot). - Expo development build installed with
xcrun simctl install. Its URL scheme is not pre-approved, so iOS shows the confirmation on the first deep link.
Steps
npx agent-device open <bundle-id> --launch-url "<scheme>://..." --platform ios --udid "$SIM" --relaunch --json
npx agent-device alert get --platform ios --udid "$SIM" --json
npx agent-device alert accept --platform ios --udid "$SIM" --json # the step that the warning gives
npx agent-device snapshot -i --platform ios --udid "$SIM" --json # the documented fallback for unrecognized labels
npx agent-device find text "Ouvrir" click --platform ios --udid "$SIM"
npx agent-device press 268 451 --platform ios --udid "$SIM" # position of "Ouvrir", read on a screenshot
Results
open: exit code 0,launchConfirmation: "unanswered",launchConfirmationReason: "alert-unrecognized", warning: "iOS shows an alert this open did not recognize (alert-unrecognized), so it left the launch URL unconfirmed. Inspect the current alert withalert getbefore answering it withalert accept."alert get:message: "Ouvrir dans « Modèle RN » ?",items: ["Annuler", "Ouvrir"].alert accept: exit code 1,ALERT_BUTTON_NOT_FOUND, "alert accept button not found",details.dispatched: "no".snapshot -iandfind text "Ouvrir" click: exit code 1,runnerErrorCode: APP_NOT_RUNNING, "app '' is not running", hint: "Reads do not launch the app. Relaunch it with open; if a system prompt such as a deep-link confirmation holds its launch, answer it with alert accept."press 268 451:Tapped. After that,alert getreturnedalert not foundandappstatereturnedrunningForeground.
Cause
- The runner selects the button only from English patterns:
RunnerAlertButtonChoice(^open$,^cancel$, …). This is intended (#3715). openrecognizes the confirmation only from its English title and buttons:LAUNCH_CONFIRMATION_TITLEandisLaunchConfirmation. On a non-English Simulator, this givesalert-unrecognized, as #3732 measured.- Reads do not activate an app that is not running, so that they do not drop the URL that the confirmation holds (
notRunningRefusal, #2852). Thussnapshotandpress @refcannot reach the confirmation.
Each of these rules is correct alone. Together, they leave the alert commands, which do reach the confirmation, as the only way to answer it, and those commands only accept English labels.
Suggested fix
- Let the caller name the button: for example
alert accept --button "<label>"andalert dismiss --button "<label>", oralert press "<label>". The runner activates the button whose label is exactly the given text, through the same alert path asalert accept, so it also works on a SpringBoard alert when the app is not running. It refuses withALERT_BUTTON_NOT_FOUNDwhen no button or more than one button has that label. Nothing is guessed: the caller reads the labels withalert getand chooses one. - Point the
alert-unrecognizedwarning, theAPP_NOT_RUNNINGhint, theALERT_BUTTON_NOT_FOUNDhint,help alertandcommands.mdto that option when the labels are not English.
The same option also helps with app alerts. On the App Tracking Transparency prompt on a French simulator (Xcode 27.1, iOS 27.0), alert dismiss (0.21.29 and 0.21.30) and alert accept (0.21.29) also refuse with ALERT_BUTTON_NOT_FOUND. There, the app is running, so snapshot -i and find text "Demander à l’app de ne pas me suivre" click work, but each localized alert costs a screenshot and a lookup of the label.
Expected
On a non-English Simulator, an alert command answers the launch confirmation and other system alerts with a button that the caller names, without screen coordinates and without a guessed tap.
Related
- #3921: the
alert-unrecognizedwarning says toalert accept. Its suggested fix keepsalert acceptfor a translatedOpen inprompt, which this issue shows is refused. - #3732: added
alert-unrecognized; its live test on a French simulator saw this confirmation reported asunanswered. - #3627 / #3715:
alert dismissrefuses unknown and localized labels instead of guessing. - #2852: reads refuse an app that is not running.
- Lenguaje dominante
- TypeScript
- Estrellas
- 5.1k
- Forks
- 339
- Merge medio
- 12 h 57 min
- PR fusionados (30 d)
- 653
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de callstack/agent-device
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 64/100
callstack/agent-device#3945 ·
Los mantenedores suelen responder en 1 día
-
Limrun iOS fill reports success but drops non-ASCII textPosiblemente ocupada @mvanhorn la tomó hace 4 días. Abiertobug ready-for-agent
Dificultad 2/5 1-3 horas Aptitud para principiantes 87/100
callstack/agent-device#3819 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
callstack/agent-device#1869 ·
Los mantenedores suelen responder en 1 día
-
iOS keyboard capture can race dismissal and omit the input assistant barPosiblemente ocupada @shamilovtim la tomó hoy. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 51/100
callstack/agent-device#3957 ·
Los mantenedores suelen responder en 1 día
-
iOS fill can report TEXT_ENTRY_MISMATCH before the confirmation deadlinePosiblemente ocupada @shamilovtim la tomó hoy. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
callstack/agent-device#3952 ·
Los mantenedores suelen responder en 1 día
Todos los issues de callstack/agent-device
Issues similares
-
type: bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
Los mantenedores suelen responder en 1 día
-
0️⃣ phase/new
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 70/100
microsoft/playwright#43640 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100