signalapp / signalapp/Signal-iOS
Links, attachments, and quotes in messages not independently accessible using VoiceOver
Nobody has claimed this yet.
- Dominant language
- Swift
- Stars
- 12.2k
- Forks
- 3.5k
- PR merge metrics
- No merged PRs in 30d
Description
- I have searched open and closed issues for duplicates
- I am submitting a bug report for existing functionality that does not work as intended
- This isn't a feature request or a discussion topic
Bug description
Messages which contain two or more of the following are guaranteed to be problematic for VoiceOver users:
- Attachments (including photos, audio and video)
- Links
- A quoted message
- Plain text (including captions)
The problem is that VoiceOver sees the entire message as a single control, when in reality it is multiple controls which can be tapped individually. VoiceOver does not "know" about the multiple controls, so when the user double-taps to interact with the message or triple-taps to long-press the message, VoiceOver will just pick a part of the message and generate a tap or a press there. And that spot on the screen might be the text, or it might be the link. This effectively locks Voiceover users out of interacting with the separate elements of a multimedia message.
I will list some example scenarios:
- My friend sends a long message containing a paragraph of text with a link at the end.
- If I double-tap this message, the link doesn't open, because VoiceOver has double-tapped the wrong part of the text.
- Or, maybe VoiceOver coincidentally taps the right part of the text,but now I can't long-press to react because I'll be pulling up the link preview instead.
-
My friend sends me a document, audio file, or photo with a caption. Now I can't access that attachment, full-stop. If I double-tap the screen, I'm not tapping on the audio file; I'm tapping on the text of the caption. Additionally, VoiceOver does not read any useful information about the file, including the name, size and sometimes even the media type.
-
I send two messages to a group: "Anyone want to grab coffee tomorrow?" "Also I found that recipe for chocolate fudge brownies; I can send it if anyone wants."
- If anyone replies with "Yes please!" or similar, I won't have any idea whether they want coffee or the recipe because Voiceover does not read the quoted message.
- VoiceOver also does not allow me to double-tap on the quoted message preview to jump to it, because it's trying to double-tap the text of the reply message instead.
Steps to reproduce
- Send a message to any chat which contains a long block of text and a short link, like https://signal.org.
- Turn on VoiceOver (You can use Siri to do this).
- Touch the message. VoiceOver should say "You sent: ..." followed by the message and the link.
- Double-tap the screen anywhere. VoiceOver will try to tap on the message but will fail. You will not be able to open the link.
- Now try again with a link and no additional text.
- Touch the new link-only message with VoiceOver enabled, but do not double-tap. (You can try, but it will work this time.)
- Instead, when Voiceover starts to read the link, triple-tap the screen anywhere. This generates a long-press.
- VoiceOver should have brought up the reactions screen, but instead it will bring up the link preview.
- Now pick one of the links and send a reply to yourself that says "Cool link! Thanks for sending!"
- Try to figure out how to get VoiceOver to identify which of the two links is "cool".
Actual result: Describe here what happens after you run the steps above (i.e. the buggy behaviour)
- The user will not be able to choose which element to interact with, as described above.
- The user will not be able to read or interact with the quoted message of a reply.
- You will also notice that Voiceover doesn't read a lot of information about attachments which is visually shown--file name, size, etc. It might just say the word "audio"--or worse, "media".
Expected result: Describe here what should happen after you run the steps above (i.e. what would be the correct behaviour)
VoiceOver users should have an intuitive way to usefully interact with all elements of a composite message. There are a couple of possible ways this could work, but here's what I suggest:
My Preferred Solution:
- Do not render every attachment, link, and other interactable element as a separate Voiceover control by default. This will make message navigation (when swiping left or right) very cumbersome.
- Instead, allow the user to double-tap on a message to "expand" it. Nothing will happen visually, but the interactive controls will then populate right after the message itself, and the user will be able to touch them individually, swipe left and right to go through them in order, etc.
- This can include text, links, media attachments, audio attachments, and a quoted message, presented in readin order. This is also a good opportunity to break up multiple lines into individual paragraph controls for easier reading.
- When expanding a message, change the accessibility label of the parent item to something like "Expanded message from Bob" followed by the timestamp and message status.
- Make sure these really do populate after the message in whatever the iOS equivalent of a DOM is, because otherwise keyboard navigation and the left/right swipe gestures will not find them.
- Give the media items useful accessibility labels. Instead of "Media", try "Photo, 193 KB, screenshot.PNG"
- From here, the user can double-tap on a link, file, etc. to interact with it, or double-tap on a reply to jump to the original message.
- The user can also triple-tap on one of these elements to--for instance--react to the message, copy the link, or export the audio file.
- Allow the user to double-tap on the parent item to collapse it again, which will remove the links and attachments from swipe order and add all the information back into the label.
- For messages which contain no text, there will still be no way for the user to long-press and react to it. So when a message is expanded, the touch target on the parent control ("Expanded message from ...) needs to be intentionally set, so that the user can triple-tap on that parent control to bring up the reactions picker and message menu.
- Perhaps add code to allow only one message to be expanded at a time, to avoid clutter.
Alternative Solution:
I think it's also possible to render the attachments and URLs as actual links inside the parent element, and VoiceOver will then allow the user to "turn the rotor" (basically, make a minor rotation on the screen with two fingers) until they reach the "Links" option. From there, they can swipe up and down (no, not left and right) to go through the links in the message. Someone is going to point this out in the comments so I will outline why I hesitate to recommend it:
- I don't know if the touch target will update properly when the user selects a link from the rotor. So VoiceOver might open the link or attachment when double-tapping, but I'm not sure if triple-tapping will work.
- Some people will not know about the links rotor. If a user wants to interact with a message in any meaningful way, the first thing they'll do is double-tap it.
- I've had multiple developers tell me they have no idea how to do this. As far as I can tell, when it does work in an app, it's accidental.
So I think the first approach with "Expanding" messages might be more intuitive for users and developers alike.
Device info
Device: iPhone 15 Pro Max
iOS version: 26.1
Signal version: 7.83 (1111)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the composite-message scenarios on iOS with VoiceOver, following the listed steps for links, attachments, captions, and quoted messages. Compare the current behavior with the proposed interaction model; done means users can identify and independently interact with each element, access useful attachment information, and still invoke message reactions.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- accessibility, mobile
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100