Feedback number: FB20451665
When building with Xcode 26, Voice Over is reporting an extra tab when swiping through tabs. Please see the sample project below:
/*
This is a Sample project to show that I believe there is a Voice Over bug in iOS 26.
When swiping through tabs with Voice Over active, there always appears to be an extra tab.
Here I have 5 tabs, when on tab one VO reads out tab 1 of 6, then tab 2 of 6, all the way to the last tab, when voice over reads out tab 5 of 6. Never tab 6 of 6.
Is there a possibility that voice over is picking up the underlying `more` tab and reading that out?
This has also been reportedly found in the Files app here:
https://www.applevis.com/comment/195441#comment-195441
*/
struct ContentView: View {
var body: some View {
TabView {
/// Activating this has Voice over telling us there are 6 Tabs.
Tab(RootTab.home.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.home.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.home.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.home.title.capitalized) tab")
Tab(RootTab.diary.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.diary.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.diary.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.diary.title.capitalized) tab")
Tab(RootTab.meals.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.meals.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.meals.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.meals.title.capitalized) tab")
Tab(RootTab.knowledge.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.knowledge.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.knowledge.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.knowledge.title.capitalized) tab")
Tab(RootTab.profile.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.profile.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.profile.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.profile.title.capitalized) tab")
/// Activating this also has Voice over telling us there are 6 Tabs.
// ForEach(RootTab.allCases, id: \.self) { tab in
//
// Text("This is the \(tab.title.capitalized) screen")
// .tabItem {
// Label(tab.title.capitalized, systemImage: "circle.fill")
// }
// .accessibilityLabel("\(tab.title.capitalized) tab")
// .accessibilityHint("Double tap to open the \(tab.title.capitalized) tab")
// }
}
}
enum RootTab: CaseIterable {
case home
case diary
case meals
case knowledge
case profile
var title: String {
switch self {
case .home:
"home"
case .diary:
"diary"
case .meals:
"meals"
case .knowledge:
"knowledge"
case .profile:
"profile"
}
}
}
}
I'm curious if anyone else can see this issue, or if anyone knows of a workaround for it.
Explore best practices for creating inclusive apps for users of Apple accessibility features and users from diverse backgrounds.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
We've identified a regression in iOS 26.0 and 26.1 Beta 4 where AVSpeechSynthesisVoice(language:) no longer respects user-selected voices from Accessibility settings.
Issue: When users select a specific voice in Settings → Accessibility → Spoken Content → Voices, calling AVSpeechSynthesisVoice(language:) returns the system default voice instead of the user's selection. This worked correctly in iOS 18.6.2.
Particularly affects:
Third-party speech synthesis voices (CereProc, Grammatek, etc.)
Apps relying on automatic voice selection based on user preferences
Example:
// User selected CereProc Heather for en-GB in Accessibility settings
let voice = AVSpeechSynthesisVoice(language: "en-GB")
print(voice?.name) // iOS 18.6.2: "HEATHER", iOS 26: "Daniel" (system default)
Interesting observation: The new Accessibility Reader feature in iOS 26 correctly uses the user-selected voice, but Tap to Speak and the API both ignore the setting.
Tested methods:
AVSpeechSynthesisVoice(language:)
AVSpeechUtterance auto-selection
Reflection for new APIs
All return the system default voice, not the user's preference.
Filed: FB[20271264]
Has anyone else encountered this? Any known workarounds to programmatically access the user's preferred voice selection?
Hello,
Whenever I put accessibility focus on an image and if image has some text in it, voiceover reads that text along with image's accessibility label.
Is there a way to programmatically turn off text recognition on images for accessibility?
I couldn't find any relevant accessibility API's that could help here.
Thanks!
We use an embedded WKWebView for several screens in our app.
Recently, we have been testing keyboard navigation via Full Keyboard Access in our apps. On IOS 18, everything works pretty much as expected. On IOS 26, it does not.
On IOS 26, you can "tab" away from the webview and then never tab back to the webview for keyboard navigation.
Is this a known issue? Are there workarounds for this issue that anyone is aware of?
System settings => Accessibility => System Voice => the little (i) beside the pulldown => Voices => THIS SCREEN will allow you to download Premium Voices
Is there a way to trigger this screen programmatically. Or at least a link to get my users there without having to dig thru that swamp of screens?
Hello!
I was doing some accessibility testing for my app and found out that when the user switches the text size, all of the data in the text fields is reset, which causes major disruption.
I've tried looking for documentation, but all I've found is information on how to dynamically scale the UI for different text sizes, which I've already implemented.
My guess is that every time Dynamic Type registers a change, it redraws my UI instead of just updating it.
How can I make sure the data is not reset when the text size changes?
Hey,
We've run into an issue where WKWebView contents are not always available for VoiceOver users. It seems to occur when WKWebView contents are loaded asynchronously.
I have a sample project where this can be reproduced and a video showing the issue. See FB21257352
The only solution we currently see is forcing an update continuously using UIAccessibility.post(notification: .layoutChanged, argument: nil), but this is ofc a last resort as it may have other unintended side effects.
My team has a robust digital accessibility program and processes for WCAG conformance in our apps. Because of this, there are definitely accessibility defects that get caught and addressed in order of impact and business priority like any other bug. Obviously we want to aim for 100% accessibility for our users, but it's a continual work in progress as new enhancements or changes are released.
I'm stuck on the appropriate measurement to indicate support. If we have 50 common tasks and the most central 10 tasks are solid but some supporting (but also common) tasks have a contrast fail or accessibleLabel missing, does that make the whole app not supporting the feature? If "completing the task" is the rubric there are a whole range of interpretations for that.
In a complex app, I anticipate that a group like ours will have strong support for many of the Accessibility Nutrition Labels accessibility features across tasks and devices, but realistically never be 100% free of defects for a given Apple Accessibility feature, even among core tasks.
As I consider the next steps for Nutrition Labels, I do not see anything in the documentation that gives a sort of baseline or measurement for inclusion. We plan to test all steps to complete a task, and log defects accordingly with an assigned timeline for fixing them (as would be true for functional defects).
I have an app that needs Input Monitoring permissions to get keyboard access in the background. I've attempted to use both IOHIDCheckAccess(kIOHIDRequestTypeListenEvent) and IOHIDRequestAccess(kIOHIDRequestTypeListenEvent), but they always return denied, even though I have given the permission for Input Monitoring to the app in Settings.
Is there something I need to put in my Info.plist to enable this permission to work?
Topic:
Accessibility & Inclusion
SubTopic:
General
Hi Community,
I'm excited to share R Helper, a speech practice app I built with accessibility as the core focus from day one.
App Store: https://apps.apple.com/app/speak-r-clearly/id6751442522
WHY I BUILT THIS
I personally struggled with R sound pronunciation growing up. It affected my confidence in school and job interviews. That experience taught me how important accessible practice tools are.
R Helper helps children and adults practice R sounds with full accessibility support.
ACCESSIBILITY FEATURES IMPLEMENTED
VoiceOver - complete navigation and feedback
Voice Control - hands-free operation
Dynamic Type - scales to large accessibility sizes
Reduce Motion - respects user preference
Dark Mode - user controllable
High Contrast compatibility
Differentiate Without Color
THE CHALLENGE
Most speech practice apps ignore accessibility. I wanted to change that and prove that specialized educational apps can be fully accessible.
KEY FEATURES
Works 100% offline, no internet needed
Zero data collection, privacy first
Generous free tier with all accessibility features included
10 story missions with gamification
7 languages supported including RTL for Arabic
LESSONS LEARNED
Accessibility is not hard when you prioritize it from the start. VoiceOver labels and hints make a huge difference. Testing with accessibility features enabled is essential. Standard SwiftUI components handle most accessibility automatically. Reducing motion significantly helps users with vestibular issues.
TECHNICAL DETAILS
Built with SwiftUI, targets iOS 17 and up. Universal app for iPhone and iPad. Fully offline using CoreData and local storage. No third party analytics, privacy focused.
QUESTIONS FOR THE COMMUNITY
What accessibility features do you find users request most? How do you test accessibility features efficiently?
WHATS NEXT
I'm currently working on expanding the word library, adding more story content, improving haptic feedback
Thanks for reading.
Nour
Topic:
Accessibility & Inclusion
SubTopic:
General
Tags:
Education and Kids
Education
Machine Learning
Apple Intelligence
We recently adopted our app to Liquid Glass and received a complaint from a visually impaired user that VoiceOver does not read out the number of unread items in the tab bar anymore. We checked and it seems that before iOS 26/Liquid Glass, setting a tab bar item's badgeValue property also set an appropriate text to its accessibilityValue property (something like "3 items"). But with Liquid Glass tab bars, this does not seem to be the case anymore.
We fixed this by providing our own accessibility value, but we're wondering whether this change was a deliberate choice or simply a bug? If this new behavior is considered a bug, I would post a bug report.
Greetings!
I'm facing a problem handleling full keyboard access in my app.
This is a simpler version of the code:
struct PrimerTest: View {
@FocusState private var focusedImage: Int?
var body: some View {
VStack(alignment: .leading, spacing: 20) {
Link("Go to google or smth", destination: URL(string: "https://google.com")!)
.font(.headline)
Text("First text")
Text("Second text")
HStack {
Text("Label")
.accessibilityHidden(true)
Spacer()
Button("Play") {
print("Im a button")
}
}
Text("Selecciona un perfil con el teclado (Tab):")
.font(.caption)
.foregroundColor(.secondary)
HStack {
ForEach(0..<5, id: \.self) { index in
Image(systemName: "person.circle.fill")
.resizable()
.frame(width: 30, height: 30)
.focusable(true)
.focused($focusedImage, equals: index)
.foregroundStyle(focusedImage == index ? Color.blue : Color.gray)
.scaleEffect(focusedImage == index ? 1.2 : 1.0)
.animation(.easeInOut, value: focusedImage)
.accessibilityHidden(true)
}
}
}
.navigationTitle("Title n stuff")
.padding()
}
}
And the focus behaves as expected and the important thing, we can access que button on the right side of the screen
But as soon as we introduce the scrollview, the right side button is unaccessible, since when we hit tab we go back to the back button in the nav stack header.
struct PrimerTest: View {
@FocusState private var focusedImage: Int?
var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: 20) {
Link("Go to google or smth", destination: URL(string: "https://google.com")!)
.font(.headline)
Text("First text")
Text("Second text")
HStack {
Text("Label")
.accessibilityHidden(true)
Spacer()
Button("Play") {
print("Im a button")
}
}
Text("Selecciona un perfil con el teclado (Tab):")
.font(.caption)
.foregroundColor(.secondary)
HStack {
ForEach(0..<5, id: \.self) { index in
Image(systemName: "person.circle.fill")
.resizable()
.frame(width: 30, height: 30)
.focusable(true)
.focused($focusedImage, equals: index)
.foregroundStyle(focusedImage == index ? Color.blue : Color.gray)
.scaleEffect(focusedImage == index ? 1.2 : 1.0)
.animation(.easeInOut, value: focusedImage)
.accessibilityHidden(true)
}
}
}
}
.navigationTitle("Title n stuff")
.padding()
}
}
I've tried all the things I found online and none achieves an acceptable behavoir, I've seen ppl saying this issue has been fixed in ipados with the focusSection modifier, but I have not seen any fix fot this issue in ios.
Hello!
I was faced with unexpected behavior of hardware keyboard focus in UITests.
A clear description of the problem
When running UITests on the iOS Simulator with both "Full Keyboard Access" and "Connect Hardware Keyboard" options enabled, there is a noticeable delay between keyboard actions for focus managing (like pressing Tab or arrow keys). The delay seems to increase with repeated input and suggests that events are being queued instead of processed immediately.
I will describe why I have such an assumption later.
A step-by-step set of instructions to reproduce the problem
Launch the iOS Simulator.
Enable both "Full Keyboard Access" and "Connect Hardware Keyboard" in the Simulator settings.
Run a UITest on a target application (ideally an endless or long-running test).
Once the app is launched, press the Tab key several times.
Observe the delay in focus movement.
Optionally, press the Tab or arrow keys rapidly, then stop the UITest.
After stopping, you’ll see a burst of rapid focus changes.
What results you expected
We expected keyboard actions (like Tab) to be handled immediately and the UI focus to update smoothly during UITests.
What results you saw
There was a 4–10 (end more) second delay between pressing keys and seeing a response. All stacked keyboard events (used for managing focus) are performed all at once after stopping the UITest.
The version of Xcode you are using
Xcode: Version 16.3 (16E140)
Simulator: iPhone 16 Pro (iOS 18.4 and 18.1)
Simulator: iPad Pro 11-inch (M4) (iPadOS 17.5)
After IOS 26 beta 2 installation in my iphone 13, I can't do a screenshot using assistivetouch nor touch on back.
Hi Apple Developer Community,
I'm experiencing persistent issues with the Apple Search Ads API since today morning (August 16, 2025). My application keeps getting "Service Unavailable" errors when trying to connect to the API endpoints.
Error Details:
Error Message: "Service Unavailable"
HTTP Status: 503/500
API Endpoint: https://api.searchads.apple.com/api/v5/*
Frequency: Consistent failures since August 16, 2025
What I've Tried:
Verified API credentials and certificates are valid
Tested multiple API endpoints
Checked network connectivity
The API was working fine until yesterday, and no changes were made to our implementation. Any insights or updates from the community would be greatly appreciated.
Thanks in advance for your help!
I am working on capturing 48MP images using the iPhone 16 Pro Max with the Ultra-wide camera. I’ve updated the code to capture the maximum supported dimensions with the following snippet:
if #available(iOS 16.0, *) {
photoOutput.maxPhotoDimensions = device.activeFormat.supportedMaxPhotoDimensions.last!
photoSettings.maxPhotoDimensions = .init(width: 5712, height: 4284)
}
However, I’m still not getting the expected results. My goal is to capture 48MP images, and I want to confirm if the Ultra-wide camera supports this resolution or if I’m missing any other configuration.
Any guidance would be appreciated!
I’m seeing a layout issue in SwiftUI on iOS 26 that only reproduces with specific Accessibility Motion settings.
Steps to reproduce
1. Open Settings → Accessibility → Motion.
2. Enable Reduce Motion and Prefer Cross-Fade Transitions.
3. Launch an app with a SwiftUI TextField.
4. Tap the field to show the keyboard.
5. Dismiss the keyboard (tap outside, swipe down, etc.).
Expected:
After the keyboard is dismissed, the view’s bottom safe area / layout should return to normal.
Actual:
The view continues to reserve space equal to the keyboard height — as if the keyboard were still visible. UI anchored to the safe area remains shifted upward until the view is reloaded.
I have an app that uses nearby with a custom accessory.
works great on iPhone 11-13,
starting with iPhone 14, one must use ARkit to get angles
we have two problems
ARkit is light sensitive, and we do not control the lighting where this app would run.. the 11-13 action works great even in the dark. (our users are blind, this is an accessibility app)
ARkit wants to be foreground, but our uses cannot see it, and we have a voice oriented UI that provides navigation instructions..
IF ARkit is foreground, our app doesn't work.
with iPhone 15 ProMax, on IOS 18, I got an error, access denied. (not permission denied) now that I am on IOS 26.. bt scan doesn't happen
also fails same way on iPhone 17 on IOS26, can't callback now as release signing is no longer done
this same code works ok on iOS 17.1 on iPhone 12.
Info.plist here
info.txt
if(SearchedServices == [] ){
services = [TransferService.serviceUUID,QorvoNIService.serviceUUID]
}
logger.info(
"scannerready, starting scan for peripherals \(services) and devices \(IDs)")
filteredIDs=IDs;
scanning=true;
centralManager.scanForPeripherals(withServices: services,
options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
the calling code
dataChannel.autoConnect=autoConnect;
dataChannel.start(x,ids) // datachannel.start is above
self.scanning = true;
return "scanning started";
... log output
services from js = and devices= 5FE04CBB
services in implementation =
bluetooth ready, starting scan for peripherals [] and devices ["5FE04CBB"]
scannerready, starting scan for peripherals [6E400001-B5A3-F393-E0A9-E50E24DCCA9E, 2E938FD0-6A61-11ED-A1EB-0242AC120002] and devices ["5FE04CBB"]
⚡️ TO JS {"value":"scanning started"}
Hello Albert!
I am experiencing some strange bugs around DeviceActivityEvents (part of the DeviceActivity framework) on iOS 26 / iOS 26.1 / iOS 26.2 beta:
When creating a DeviceActivityEvent we can assign a threshold and applicationTokens.
The idea is, that after the user has spent said threshold on said apps, eventDidReachThreshold() is called.
The property includesPastActivity is set to false.
On iOS 26 however, it happens (quite reliably after updating to a new beta seed) quite often that eventDidReachThreshold() is called immediately (after a couple of seconds) instead of waiting for the threshold to be met.
Is anyone else seeing similar issues on iOS 26 / iOS 26.1 / iOS 26.2 beta?
Only workaround I have found is to ask users to revoke and re-grant Screen Time permissions. This only holds for about two weeks though or at most until the next iOS 26 beta update is installed, so it is not a permanent solution unfortunately.
Feedback (incl. sysdiagnoses and sample project) is filed under:
FB18061981
FB18927456
One of our users has filed their own feedback request as well:
FB20817853
Thanks a lot for any help on this!
Hello,
I have the following problem. I’m developing a NoCode app using the FlutterFlow platform and have been working on it for over a year.
This time, after publishing a new version of the app through FlutterFlow, I tried logging into Apple Store Connect, but I got an error saying that I had made too many login attempts and needed to try again later. However, I hadn’t attempted to log in before that at all.
No matter how long I wait—24 hours, 48 hours—the same error keeps appearing, meaning I still can’t access my account. Apple Support hasn’t responded for 4 days, and in total, I’ve been locked out of my account for over 9 days.
Please help me understand what might be causing this issue. Apple Store Connect refuses to send me an SMS with the login code.
Topic:
Accessibility & Inclusion
SubTopic:
General