iOS VoiceOver
ios_voiceoverDrive iOS VoiceOver on a real device and read where its cursor lands. Actions: 'status' (is it on), 'start' / 'stop' (turn VoiceOver on or off — a few seconds each; 'enable' / 'disable' are accepted as the same, matching android_talkback), 'next' / 'previous' (move to the next or previous element), 'activate' (VoiceOver's double tap on the current element), 'back', 'home', 'rotor' (change the rotor setting — Headings, Links, Words…; pass direction), 'rotor_item' (previous / next item of the current rotor setting; pass direction), 'read_all' (read from the top for duration seconds, then pause). Each move returns text — the accessibility label of the element VoiceOver settled on, plus its focus (label, frame in points, app). The exact spoken sentence (roles, hints) is redacted by iOS; the label is what is available — an element VoiceOver reports without a label (some search fields) shows as "(no label)" even if its page-source entry has a label or placeholder, so check ios_page_source before calling it unlabelled. text is null when VoiceOver did not report a new position (end of the screen, or an activate — an activate usually works but the new position is not reported until the next move, and its note says so); right after start there is no cursor yet, so a first move that lands nowhere is retried once and then carries a note — move once more. read_all reads at speaking pace, a few seconds per item, so its list holds only what was reached in duration seconds (the reply echoes the duration used); the list can miss the first item, so use next / previous for a complete transcript; its final position is the last item listed. If a move reports no position and VoiceOver has switched itself off (a system prompt it cannot reach may be showing), the reply says enabled: false. On a device seeing VoiceOver for the first time, iOS shows a one-time "VoiceOver changes the gestures" sheet that holds the cursor until someone answers Use VoiceOver. While VoiceOver is on, taps and swipes behave differently (one tap selects, a double tap activates), so stop it when done. The device is kept silent automatically while VoiceOver is on, unless someone is watching it in a browser, who hears it instead.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID | |
| action | Yes | What to do. 'status' changes nothing. | |
| duration | No | For 'read_all' only: seconds to read for. Default 30. | |
| direction | No | For 'rotor' and 'rotor_item' only. Default 'next'. |