Describe the bug
VoiceOver on iOS: accessibility tree appears empty, no element can be selected or activated
Summary
On iOS, VoiceOver cannot select or activate any control in an Avalonia
application. Swiping produces only the "no element" tone; tapping a control
does not place the VoiceOver cursor on it and nothing is announced. The app
itself is not frozen — it is fully usable again the moment VoiceOver is turned
off, and touch input works normally with VoiceOver disabled. This suggests the
UIAccessibility bridge exposes no elements, so VoiceOver intercepts every touch
and never finds anything to hand it to.
The same application code works correctly on macOS: VoiceOver announces
controls, reads their AutomationProperties.Name, and tab navigation moves
through the tree as expected.
Environment
| |
|
| Avalonia |
12.1 |
| .NET |
10.0 |
| Microsoft.iOS.Sdk |
26.5.10284 |
| Xcode |
26.6 |
| Device |
iPhone 17 Pro (iPhone18,3) |
| iOS |
26.6 (23G71) |
| Build configuration |
Debug, deployed to physical device |
| macOS (working comparison) |
same Avalonia/.NET versions, net10.0-macos |
To Reproduce
Steps to reproduce
-
Create a view containing nothing but a TextBlock and a Button:
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyApp.Views.MainView">
<StackPanel Margin="40" Spacing="16">
<TextBl
ock Text="Heading" FontSize="24" />
<Button Content="Test button" />
</StackPanel>
</UserControl>
-
Deploy to a physical iOS device (iOS 26.6).
-
Enable VoiceOver.
-
Tap the button, or swipe right from the top of the screen.
Expected behavior
Expected
VoiceOver places its cursor on the elements and announces "Heading" and
"Test button, button", as it does for the equivalent view on macOS.
Actual
Only the "no element found" tone. No focus rectangle appears, nothing is
announced, and double-tap does nothing. Turning VoiceOver off restores normal
touch interaction immediately.
Avalonia version
12.1.0
OS
iOS
Additional context
What has been ruled out
This started as an investigation into a production app for blind and visually impaired users, where the same symptom appears
on every screen. The following were eliminated one by one:
- Missing or incorrect automation properties. All interactive controls are
real
Button instances carrying AutomationProperties.Name, set both in
XAML and via AutomationProperties.SetName for dynamically built items.
- Custom or non-standard controls. The reduced case above contains only a
stock
TextBlock and Button.
LayoutTransformControl. The app wraps its content in one for UI
scaling. Removing it entirely changed nothing. (This had seemed a plausible
cause, since VoiceOver on iOS hit-tests by screen coordinates rather than
walking the tree as it does on macOS.)
- Bundle localization.
CFBundleDevelopmentRegion and
CFBundleLocalizations were absent and have been added. This fixed a
separate issue on macOS, where Dutch text was being read with an English
voice, but made no difference to element discovery on iOS.
- Trimming. The failure occurs in Debug builds, where trimming is not
applied.
- Navigation and layout infrastructure. Reducing
MainView to the two
controls shown above — no navigation host, no ContentControl, no insets
handling — did not change the behaviour.
macOS comparison
A stock dotnet new avalonia.xplat project, unmodified apart from adding a
TextBlock and a Button, was built for macOS and tested with VoiceOver. Both
elements are announced correctly. The production app on macOS behaves the same
way: tab navigation works and labels are read.
We were unable to build that same template project for iOS to complete the
comparison — it failed on codesigning (Disallowed xattr com.apple.FinderInfo)
after several attempts on this machine. The iOS evidence above therefore comes
from the production app reduced to a minimal view, rather than from a fresh
template. Anyone able to build a clean template for iOS should be able to
confirm or contradict this in a few minutes, and that would be worth doing
before assuming the cause is what it appears to be.
Impact
The application is being built for a library service for blind and
visually impaired readers. VoiceOver support is not an enhancement here — it is
the only way most of the intended audience can use the app at all. The macOS,
Windows (NVDA) and Android builds are all usable; iOS is currently not
shippable.
Happy to provide a stripped-down reproduction project, device logs, or to test
a patch.
Describe the bug
VoiceOver on iOS: accessibility tree appears empty, no element can be selected or activated
Summary
On iOS, VoiceOver cannot select or activate any control in an Avalonia application. Swiping produces only the "no element" tone; tapping a control does not place the VoiceOver cursor on it and nothing is announced. The app itself is not frozen — it is fully usable again the moment VoiceOver is turned off, and touch input works normally with VoiceOver disabled. This suggests the UIAccessibility bridge exposes no elements, so VoiceOver intercepts every touch and never finds anything to hand it to.
The same application code works correctly on macOS: VoiceOver announces controls, reads their
AutomationProperties.Name, and tab navigation moves through the tree as expected.Environment
To Reproduce
Steps to reproduce
Create a view containing nothing but a
TextBlockand aButton:Deploy to a physical iOS device (iOS 26.6).
Enable VoiceOver.
Tap the button, or swipe right from the top of the screen.
Expected behavior
Expected
VoiceOver places its cursor on the elements and announces "Heading" and "Test button, button", as it does for the equivalent view on macOS.
Actual
Only the "no element found" tone. No focus rectangle appears, nothing is announced, and double-tap does nothing. Turning VoiceOver off restores normal touch interaction immediately.
Avalonia version
12.1.0
OS
iOS
Additional context
What has been ruled out
This started as an investigation into a production app for blind and visually impaired users, where the same symptom appears on every screen. The following were eliminated one by one:
Buttoninstances carryingAutomationProperties.Name, set both in XAML and viaAutomationProperties.SetNamefor dynamically built items.TextBlockandButton.LayoutTransformControl. The app wraps its content in one for UI scaling. Removing it entirely changed nothing. (This had seemed a plausible cause, since VoiceOver on iOS hit-tests by screen coordinates rather than walking the tree as it does on macOS.)CFBundleDevelopmentRegionandCFBundleLocalizationswere absent and have been added. This fixed a separate issue on macOS, where Dutch text was being read with an English voice, but made no difference to element discovery on iOS.MainViewto the two controls shown above — no navigation host, noContentControl, no insets handling — did not change the behaviour.macOS comparison
A stock
dotnet new avalonia.xplatproject, unmodified apart from adding aTextBlockand aButton, was built for macOS and tested with VoiceOver. Both elements are announced correctly. The production app on macOS behaves the same way: tab navigation works and labels are read.We were unable to build that same template project for iOS to complete the comparison — it failed on codesigning (
Disallowed xattr com.apple.FinderInfo) after several attempts on this machine. The iOS evidence above therefore comes from the production app reduced to a minimal view, rather than from a fresh template. Anyone able to build a clean template for iOS should be able to confirm or contradict this in a few minutes, and that would be worth doing before assuming the cause is what it appears to be.Impact
The application is being built for a library service for blind and visually impaired readers. VoiceOver support is not an enhancement here — it is the only way most of the intended audience can use the app at all. The macOS, Windows (NVDA) and Android builds are all usable; iOS is currently not shippable.
Happy to provide a stripped-down reproduction project, device logs, or to test a patch.