Repository navigation
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 #3922
Description
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 fix(ios): alert dismiss picks a listed decline, never a guessed one #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 screenshotResults
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 (fix(ios): alert dismiss picks a listed decline, never a guessed one #3715). openrecognizes the confirmation only from its English title and buttons:LAUNCH_CONFIRMATION_TITLEandisLaunchConfirmation. On a non-English Simulator, this givesalert-unrecognized, as fix(ios): report the alert's own title and surface an unanswered launch confirmation #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, fix(ios): never launch a not-running session app from an observation #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
- iOS: the alert-unrecognized warning of
open --launch-urlsays toalert accept, which grants App Tracking Transparency when that is the alert #3921: thealert-unrecognizedwarning says toalert accept. Its suggested fix keepsalert acceptfor a translatedOpen inprompt, which this issue shows is refused. - fix(ios): report the alert's own title and surface an unanswered launch confirmation #3732: added
alert-unrecognized; its live test on a French simulator saw this confirmation reported asunanswered. - iOS: alert dismiss taps "Allow" on the App Tracking Transparency prompt #3627 / fix(ios): alert dismiss picks a listed decline, never a guessed one #3715:
alert dismissrefuses unknown and localized labels instead of guessing. - fix(ios): never launch a not-running session app from an observation #2852: reads refuse an app that is not running.
Activity