User agent reliability for VoiceOver iOS Screen reader compatibility

Screen Readers
Nov 26, 2024

Shows how well VoiceOver iOS supports ARIA and WCAG sufficient techniques.

Latest version tested

VoiceOver iOS 17.7 with Safari iOS 17.7

  • All tests: 69 pass of 86 tests (80%)
  • ARIA tests: 27 pass of 31 tests (87%)
  • WCAG tests: 48 pass of 61 tests (79%)

Reliability trend

100%80%60%40%20%0%201467%201564%201664%201764%201866%201967%202068%202168%202274%202375%202480%

Failing tests

 TestModeWhat the user hearsNotes
Page with xml:lang set on the html and p elementsTouchAct-if tay-bill. Ray-day-oh.Pronounced as English. Ignores xml:lang.
application/xhtml+xml page with mismatching lang and xml:lang on the html elementTouchGa-raj. Doo-ble. Damm. Un, zway, dray.Speech pronounced as lang=fr, but CSS matches :lang(de) and German CSS content pronounced as French.
audio with aria-label attributeTouch Nothing Nothing voiced for audio - no indication it exists
audio with aria-labelledby attributeTouch Nothing Nothing voiced for audio - no indication it exists
audio with title attributeTouch Nothing Nothing voiced for audio - no indication it exists
abbr with titleTouchT L NABBR expansion ignored.
button containing img with title attributeTouchButtonReads "button" without saying what button does.
fieldset containing linksTouchLegend for enclosed links, form start. Home, link. About, link. Contact link, form end.The fieldset is announced as a form, but contains no form controls.
img with figcaptionTouchOne thousand, two hundred and thirty four PNG, image, test image. Violet, taken on twelve slash eleven slash two thousand and ten.Reads out meaningless filename, then FIGCAPTION.
area and img with alt attributesTouchThis is alt text. (This is left alt text, link. This is right alt text, link)Very hard to find AREA links because image map links are not announced when reading. It is possible to find them by minesweeping, or using the Next Link gesture, but there are no audible cues to tell the user they're missing links.
area with title attributeTouchThis is alt text. (This is left title text, link. This is right title text, link.)Very hard to find AREA links because image map links are not announced when reading. It is possible to find them by minesweeping, or using the Next Link gesture, but there are no audible cues to tell the user they're missing links.
area with aria-label attributeTouchThis is alt text. (This is left ARIA label text, link. This is right ARIA label text, link.)Very hard to find AREA links because image map links are not announced when reading. It is possible to find them by minesweeping, but there are no audible cues to tell the user they're missing links.
area with aria-labelledby attributeTouchThis is alt text. (Left arrow HTM, link. Right arrow HTM, link.)Very hard to find AREA links because image map links are not announced when reading. URLs read out instead of ARIA-LABELLEDBY when Next Link gesture is used.
Data table with th scope on cell headersTouch Name, row header, row 1 column 2, table start 4 rows 5 columns. Phone hash symbol, row 1 column 3. Fax hash symbol, row 1 column 4. City, row 1 column 5. One, row 2 column 1. Joel Garner, row 2 column 2. 412 212 5421, row 2 column 3. 412 212 5400, row 2 column 4. Pittsburgh, row 2 column 5. Two, row 3 column 1. Clive Lloyd, row 3 column 2. 410 306 1420, row 3 column 3. 410 306 5400, row 3 column 4. Baltimore, row 3 column 5. Contact information, table end. Incomprehensible - doesn't read any cell headings.
Data table with td headers attributeReading Homework, row header, column header, spans 2 rows, row 1 column 1, table start, 3 rows 7 columns. Exams, column header, spans 3 columns, row 1 column 2. Projects, column header, spans 3 columns, row 1 column 5. Exams, one, row 2 column 2. Exams, two, row 2 column 3. Exams, final, row 2 column 4. Projects, one, row 2 column 5. Projects, two, row 2 column 6. Projects, final, row 2 column 7. Homework, fifteen percent, row 3 column 1. Exams, fifteen percent, row 3 column 2. Exams, fifteen percent, row 3 column 3. Exams, twenty percent, row 3 column 4. Projects, ten percent, row 3 column 5. Projects, ten percent, row 3 column 6. Projects, fifteen percent, row 3 column 7, table end, end, end. Table incomprehensible - only first header in HEADERS list is voiced.
PDF18 Document with doc titleTouchSlash SR_PDF_doc_title.pdfVoices full URL. URL displayed in browser tab instead of title.
PDF16 Document default language set to FrenchTouchAct-if tay-billPronounced as English, document language ignored

Passing tests

 TestModeWhat the user hearsNotes
Page with lang set on the html and p elementsTouchAct-eef tab-le. Rah-di-oh.Pronounced as French and German.  
text/html page with mismatching lang and xml:lang on the html elementTouchGa-raj. Doo-ble. Damm. Un, deux, trois.Speech pronounced as lang=fr, and CSS matches :lang(fr).  
Match lang subtagsTouchDam-he. Dam-he. Dam-he.All pronounced as German.  
ARIA role=headingTouchFirst level heading, heading level 1. Second level heading, heading level 2  
Heading is img with altTouchSecond level alt, heading level 2, image, test image.Reads out text in image as well as alt text.  
applet with title attributeTouch Nothing iOS does not support applets, and does not render them on screen  
applet with fallback contentTouchFallback content for appletiOS does not support applets  
applet with aria-label attributeTouch Nothing iOS does not support applets, and does not render them on screen  
applet with aria-labelledby attributeTouch Nothing iOS does not support applets, and does not render them on screen  
applet inside figure with figcaption elementTouchFigure caption for applet  
embed with title attributeTouchTitle text for embed  
embed inside figure with figcaptionTouchFigure caption for embed  
embed with aria-label attributeTouchAria label for embed  
embed with aria-labelledby attributeTouchThis is ARIA-LABELLEDBY text  
object with fallback contentTouchFallback content for object  
object with title attributeTouchTitle for object  
object with aria-label attributeTouchAria label for object  
object with aria-labelledby attributeTouchThis is ARIA-LABELLEDBY text.  
video with aria-label attributeTouchVideo aria label, 5 seconds, video playback, end article, elapsed time 0 seconds, double-tap to play or pause.  
video with aria-labelledby attributeTouchThis is ARIA-LABELLEDBY text, 5 seconds, video playback, end article, elapsed time 0 seconds, double-tap to play or pause.  
video with title attributeTouchVideo title, 5 seconds, video playback, end article, elapsed time 0 seconds, double-tap to play or pause.  
a element placeholder link with no event handler or href attributeTouchPlaceholder text  
iframe with fallback contentTouchThis is an. Example hyperlink, link. In the target page.Fallback content is ignored  
iframe with title attributeTouchThis is an. Example hyperlink, link. In the target page.  
Interactive iframe with role=presentation and no accessible nameTouchThis is an. Example hyperlink, link. In the target page.  
button containing img with altTouchThis is image alt, button  
button containing img with aria-labelTouchThis is image aria label, button  
button containing img with aria-labelledbyTouchThis is aria labelled by, button  
button with title containing img with null altTouchThis is button title, button  
button with aria-label containing img with null altTouchThis is button aria label, button  
input type=image with altTouchThis is image button alt text, button  
input type=image with title attributeTouchThis is image button title text, button  
input type=image with aria-label attributeTouchThis is image button aria label text, button  
input type=image with aria-labelledby attributeTouchThis is image button aria-labelled by text, button  
input type=text with aria-describedby attributeTouchFirst name, description, a bit of instructions for this field linked with aria describedby, text field  
input type=text with title attributeTouchEnter search text, text field  
input type=text with aria-label attributeTouchEnter search text, text field  
input type=text with aria-labelledby attributeTouchEnter search text, text field, double tap to edit  
input type=text with label forTouchEnter search text, text field, end article, double tap to edit  
input type=text inside label with text before controlTouchEnter search text, text field, end article, double tap to edit  
input type=text inside label with text after controlTouchEnter search text, text field, double tap to edit  
input type=text inside label with text before and after controlTouchEnter search text blanks not allowed, text field, double tap to edit  
Yes/No radio buttons inside fieldset elementTouchI agree to terms and conditions, form start. Yes, radio button, ticked, one of two. No, radio button, unticked, two of two. Sign me up to the newsletter, form start. Yes, radio button, ticked, one of two. No, radio button, unticked, two of two.  
img with null altTouch Nothing Ignored as expected  
img with altTouchThis is alt text, image, test imageText in image captured via OCR  
img with titleTouchThis is title text, image, test image  
img with aria-labelTouchThis is an aria label, image, test image  
img with aria-labelledbyTouchThis is an aria labelled by, image, test image  
area with alt attribute and img with null altTouchThis is left alt text, link. This is right alt text, link.Link role only announced when reading if owner IMG has null alt.  
Link containing img with altTouchThis is a link alt, link image, test image  
Link containing img with titleTouchThis is an image title, link image, test image  
Click Here link with title attributeTouchClick here, link, this is a link title  
Link text replaced by aria-label attributeTouchThis is an aria label, link  
Link text replaced by aria-labelledby attributeTouchThis is an aria labelled by, link  
Click Here link with aria-describedby attributeTouchClick here, description, this is an aria described by, link  
Layout table with single cellReadingThis is some text.Treated as a layout table.  
Layout table with role=presentationReadingExample, Navigation. Links, Content.Table treated as layout table - not announced as table.  
Data table with role=gridReadingMorning, row header, column header, row 1, column 1, table start, 2 rows 2 columns. Afternoon, column header, row 1 column 2. Morning, free, row 2 column 1. Afternoon, busy, row 2 column 2. Table end, end, end.  
Data table with role=tableReadingThis is some text. Table start, end.Treated as a data table.  
Data table with summary and thReadingData table summary, morning, row header, column header, row 1, column 1, table start, 2 rows 2 columns. Afternoon, column header, row 1 column 2. Morning, free, row 2 column 1. Afternoon, busy, row 2 column 2, table end, end, end.Column headers are not read by the Read Screen gesture, but are read by the Read Item gesture.  
Data table with caption and thTouchTable start, 2 rows 2 columns. Morning, row header, column header, row 1 column 1. Afternoon, column header, row 1 column 2. Morning, free, row 2 column 1. Afternoon, busy, row 2 column 2, table end, end, data table caption, table end.  
Data table with role=columnheader headers but no thReadingMorning, row header, column header, row 1, column 1, table start, 2 rows 2 columns. Afternoon, column header, row 1, column 2. Morning, free, row 2, column 1. Afternoon, busy, row 2, column 2, table end.  
Data table with th cell headersReadingMorning, row header, column header, row 1 column 1, table start, 2 rows 2 columns. Afternoon, column header, row 1 column 2. Morning, free, row 2 column 1. Afternoon, busy, row 2 column 2, table end.Column headers are not read by the Read Screen gesture, but are read by the Read Item gesture.  
PDF9 Document with headingsHeadingHeading 1, heading level 1. Heading 1.2, heading level 2.  
PDF1 Image with alt textTouchThis is alt text, image  
PDF4 Decorative image marked as artifactTouch Nothing Image ignored as expected  
PDF19 Phrase language set to GermanTouchRah-di-ohPronounced as German  
PDF6 Table with header markupTouchMorning, column header, row 1, column 1, heading, table start, 2 rows, 2 columns. Afternoon, column header, row 1, column 2, heading. Morning, free, row 2, column 1. Afternoon, busy, row 2, column 2, table end.  
PDF6 Table with header markup and alt textTouchMorning, column header, row 1, column 1, heading, table start, 2 rows, 2 columns. Afternoon, column header, row 1, column 2, heading. Morning, free, row 2, column 1. Afternoon, busy, row 2, column 2, table end.Word Alt Text and Description not voiced