Hi there -- I'm cleaning up the accessibility in our app and making sure it adheres to Apple's suggested guidelines.
For accessibilityHint, apple lists a couple of suggestions in the doc here: https://developer.apple.com/documentation/objectivec/nsobject/1615093-accessibilityhint
Notably this one is one that I'm having to change a lot in our app:
Don’t include the action type in the hint. For example, don't create hints like “Tap to play the song” or “Tapping plays the song.”
However, we have some buttons that do different actions based on a double or triple tap in VoiceOver, so our hint looks something like: "Double tap to do X, Triple Tap to do Y"
This violates the accessibilityHint guidelines, but I feel like changing this would mean the customer loses out on valuable information. What does apple suggest we do in this case?
Thanks in advance!
Accessibility
RSS for tagMake your apps function for a broad range of users using Accessibility APIs across all Apple platforms.
Posts under Accessibility tag
122 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
Hi everyone,
I'm currently developing an application for VisionOS and I'm interested in implementing Dwell Control to improve accessibility for users with limited mobility. Specifically, I would like to include a toggle within my app's interface that allows users to enable or disable Dwell Control at the app level.
I've gone through the VisionOS documentation and the general accessibility guidelines, but I couldn't find detailed information on how to programmatically enable or disable Dwell Control within an app.
Here are my main questions:
Is it possible to programmatically enable or disable Dwell Control from within a VisionOS app?
If so, what are the specific API calls or methods needed to achieve this functionality?
Are there any best practices or additional resources for implementing Dwell Control in VisionOS that you could point me to?
Thanks!
It seems that when you tested the official code today, you found that screen reading works fine with English characters, but when using Chinese characters, the Text and Button elements cannot be read correctly.. It's important to address this issue to bring convenience to your blind friends.
The official code address is:https://developer.apple.com/documentation/swiftui/creating_accessible_views.
Steps to reproduce:
Connect iPhone to a Bluetooth keyboard, and enable "Full Keyboard Access" in settings
Got to https://material.angular.io/components/select/examples
Open any dropdown and use keyboard to tab away
Focus moved to the next control and dropdown panel is still open
Expected Behavior:
Dropdown should be collapsed when user tabs away using keyboard
I have a custom rotor that changes the skim speed of the skim forward/backward feature of my audio player. The rotor works, but it's always playing an end-of-list sound.
Here is the code:
// Member variables
private let accessibilitySeekSpeeds: [Double] = [10, 30, 60, 180] // seconds
private var accessibilitySeekSpeedIndex: Int = 0
func seekSpeedRotor() -> UIAccessibilityCustomRotor {
UIAccessibilityCustomRotor(name: "seek speed") { [weak self] predicate in
guard let self = self else { return nil }
let speeds = accessibilitySeekSpeeds
switch predicate.searchDirection {
case .previous:
accessibilitySeekSpeedIndex = (accessibilitySeekSpeedIndex - 1 + speeds.count) % speeds.count
case .next:
accessibilitySeekSpeedIndex = (accessibilitySeekSpeedIndex + 1) % speeds.count
@unknown default:
break
}
// Return the currently selected speed as an accessibility element
let accessibilityElement = UIAccessibilityElement(accessibilityContainer: self)
let currentSpeed = localizedDuration(seconds: speeds[accessibilitySeekSpeedIndex])
accessibilityElement.accessibilityLabel = currentSpeed + " seek speed"
UIAccessibility.post(notification: .announcement, argument: currentSpeed + " seek speed")
return UIAccessibilityCustomRotorItemResult(targetElement: accessibilityElement, targetRange: nil)
}
}
The returned accessibility element isn't read out, and instead an end-of-list sound is played. I can announce the change manually using UIAccessibility.post, but it still plays the end-of-list sound.
How can I prevent the rotor from playing the end-of-list sound?
I'm working on a command line tool that uses the Accessibility APIs on macOS. Running inside Xcode works fine, but directly from the command line I still get false from AXIsProcessTrustedWithOptions, even though the switch in System Settings is turned on.
The binary is signed with a Developer ID certificate.
What else should I look at to debug?
Hi, I am facing issue where voiceover accessibility does not work for some of the labels if I select any Indian voice from settings (Accessibility -> voiceover -> speech -> voice -> ENGLISH (INDIA)), it works for other countries' voices though for the same label. Caption panel also shows correct accessibility label but it just doesn't announce it.
Hi to all.
I'm building a Mac application using QT (PySide6).
After updating XCode to 15.3.0 (Sonoma), the Accessibility Inspector stopped working correctly, it does not display the attributes of nested elements, but only the title of the window. When using XCode 14.2 (Monterey) - everything worked correctly.
main.py
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.quit.connect(app.quit)
engine.load("main.qml")
sys.exit(app.exec())
main.qml
import QtQuick.Controls
ApplicationWindow {
visible: true
width: 600
height: 500
title: "MyApp"
Rectangle {
anchors.fill: parent
Text {
id: my_text
anchors.centerIn: parent
text: "My APP"
font.pixelSize: 45
Accessible.role: Accessible.StaticText
Accessible.name: my_text.text
Accessible.description: "my app text"
}
Accessible.role: Accessible.StaticText
Accessible.name: "Rectagle"
Accessible.description: "my app rectangle"
}
}
The code is the same for both applications
On Monterey i can select any region with accessible
On Sonoma - only title
Does anyone know a solution?
Maybe someone has a similar problem?
Hi all,
I ran into an XCUITest issue where my tests fail randomly with the message that my app "has not loaded accessibility"
I run the tests in my scheme in random order and with every run, some other random test fails and a test that previously failed would later pass. So I know it's not my test as-such that is causing the problem.
There seems to be a 60s wait for accessibility to load, and I have not found any information how I could extend the timeout or convince accessibility to load faster.
I found some older posts, but no real solution was found there either.
This completely blocks my test execution since I cannot get a single run in where the tests all pass (and I only have 10 tests in that scheme). I ran the scheme against an iOs sim and against a real iOS device and I get the same random accessibility errors on either execution platform. I've tried iOS17.2 & 17.4 and get the same behavior.
Strange enough, the test actually keeps running (and technically passes all the checks and asserts in the actual test) after the accessibility error, but then XCTest marks it as failed because of the early accessibility error.
Any ideas what I could try or what the reason could be?
Thanks!
--
I'm using XCode Version 15.3 (15E204a) and test iOS17.2 and iOS17.4
Test Case '-[MyScheme.MyTestClass testMyFunction]' started.
t = 0.00s Start Test at 2024-04-19 01:32:09.225
t = 0.02s Set Up
t = 0.02s Open com.myCompany.myApp
t = 0.03s Launch com.myCompany.myApp
t = 0.25s Wait for accessibility to load
t = 60.30s Capturing diagnostic spindump
/Users/some/path/goes/here/MyTestCase.swift:120: error: -[MyScheme.MyTestClass testMyFunction] : Application 'com.myCompany.myApp' has not loaded accessibility
t = 60.34s Waiting 60.0s for "test" Button to exist
t = 61.38s Checking `Expect predicate `exists == 1` for object "test" Button`
t = 61.39s Checking existence of `"test" Button`
... more stuff happening in the test here ...
I'm trying to get voiceover to announce accessibility label for UIActivityViewController (for a share sheet that pops up on clicking share button) before the focus goes to one of activity items inside the UIActivityViewController.
In order to achieve the above behavior, I'm just assigning accessibilityLabel for UIActivityViewController's view. But looks like I'm not able to override the default accessibility implementation of UIActivityViewController.
Is there any way we could override the existing accessibility behavior of UIActivityViewController and announce accessibility label for share options?
Thanks in advance!!
So I have a simple view for my SwiftUI application below:
import SwiftUI
struct ContentView: View {
var body: some View {
List {
ForEach(0..<4) { index in
RowView(index: index)
.accessibilityIdentifier("row")
}
}
}
}
struct RowView: View {
let index: Int
var body: some View {
HStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
Spacer()
ButtonView(index: index)
}
.padding()
}
}
struct ButtonView: View {
let index: Int
var body: some View {
VStack {
if index != 3 {
Button(action: {}, label: {
Text("Cancel")
})
.accessibilityIdentifier("cancel_button")
}
Button(action: {}, label: {
Text("Submit")
})
.accessibilityIdentifier("submit_button")
}
}
}
My goal is to reference each cancel and submit button per row for a UI Test, which I have tried doing so here:
let rowElements = app.tables.cells.matching(identifier: "row")
for i in 0..<rowElements.count {
let cancelButton = rowElements.element(boundBy: i).buttons["cancel_button"]
let submitButton = rowElements.element(boundBy: i).buttons["submit_button"]
XCTAssertTrue(cancelButton.exists, "Cancel button does not exist in row \(i)")
XCTAssertTrue(submitButton.exists, "Submit button does not exist in row \(i)")
}
Even with the identifiers set like this my tests fail and say it cannot find the buttons labeled as they are with their specific identifiers or the rows. What is the correct way to reference elements if they are in a list or table for UI Testing? I'm specifically trying to use accessibility Identifiers to make my life easy.
My app uses CGEventTapCreateForPid to monitor keyboard events of a corresponding process. My app has already enabled the Accessibility permission, and AXIsProcessTrustedWithOptions returns true. However, CGEventTapCreateForPid returns null. What could be the problem? Does anyone know? I tested and found that if CGEventTapCreateForPid returns null, I can reset the Accessibility permission using tccutil reset Accessibility myapp_bundleid without restarting my app. But my app can still get the permission through AXIsProcessTrustedWithOptions
Hello,
Recently, I've been hacking at trying to find a way for the colors of the system cursor to be changed via an executable (in particular, I'm trying to get them to match the foreground/background colors chosen by wal.) In my most recent investigation, I've located the relevant setting in ~/Library/Preferences/com.apple.universalaccess (which is a wierd place for it to be, but w/e) and attempted to change it via defaults write. This immediately caused all my GUI apps including Finder to crash repeatedly until I went into recovery mode and deleted the changed file.
My next direction in this quandary, then, is to make an application that asks for the relevant Accessibility settings (via the standard prompt that I often see) and upon being granted proper permission, is able to make the modifications without breaking the system.
Is anyone able to point me towards the documentation for such functionality, if it's possible? Preferably some kind of C or shell interface.
Hello 👋,
I am quite new in the Apple development world, so please forgive me if I am saying something wrong. I am working on a macOs application which aims to act mainly as an assistive window switcher.
In order to do so it leverages on AXUIElementCopyAttributeValues and AXUIElementCopyAttributeValue, especially the former to retrieve other application's window titles and the latter to set and focus a target main window.
I read online, according to Apple Store guidelines, that app to be accepted in App Store must be sandboxed. And as I read in several forums there may not be a way to use accessibility features within sandbox.
So, first question, based on this I would like to know if there is a way to achieve the same without accessibility features?
Currently the only thing which does not work is the permission prompt, but an user may also enable Accessibility permissions under Privacy & Security for a certain app.
May the app pass the review process, supposing no prompt will be requested to the user, but a "Getting started" will inform and guide the user to set the permissions?
Thanks in advance 🙏
I have checked almost all previous question related to my query but did not find my solution. I'm facing issue with Full keyboard access accessibility when integrate it with scrollview. Inside scrollview textfield and secure textfield are accessible with "tab" key but other component like buttons are not accessible using "tab" key.
but when I remove scrollview all elements are accessible with "tab" key.
Even in system installed iOS Apps they don't support scrollview with tab button, I have
analysed apple documentation regarding this but did not find specific to this.
Does anyone have idea regarding this kind of behaviour?
Voiceover of UIAlertController by default announces title's accessibilityTrait as static text.
I'm trying to change the accessibilityTrait to be of type header and can't seem to have a direct way to access title label and modify the attribute. Only solution seems to be to add custom label to be able to modify accessibilityTrait. Now, this got me wondering should the default behavior of UIAlertController be left untouched?
Have anyone else tried to do this? And, is there any other way to customize accessibilityTrait of UIAlertController title label that I'm missing out on?
Thanks in advance.
I would like to contact a developer on the SSML team regarding the possibility to create a new downloadable voice, in a language yet unsupported. I don't mind making a free contribution. Creating Custom voices does not seem to be a solution, since only English is supported when creating a custom voice.
We have developed a Bluetooth external Braille display and want to have it added to
to the list of Braille displays supported by VoiceOver:
https://support.apple.com/en-gb/103246
How should we proceed?
Thank you.
Application:
HTML,Javascript,Angular web Application
Issue:
In Iphone/Ipad while trying to enter English characters using Japanese keyboard in the input field
the japanese keyboard freezes and stops working after entering the first character.
Root Cause:
Two validations given in the onInput call back method causes the issue.
when the validation are removed keyboard is working fine
1.for converting lowercase letters to uppercase
2.Some Character are not allowed so they are replaced after input
My app speaks and offers the user the ability to use their Personal Voice - but if the user says "No" when I first ask them for permission to use their Personal Voice, I can never ask them again.
So if they change their mind later - they have to go to Settings->Accessibility->Personal Voice to toggle the permission for my app. To make things easier for them, I would like to be able to pop open that page for them - but I don't know how to create the URL for it. Is it even possible?
The closest I've been able to get is to open the settings page for my app (Settings->My App Settings) with:
guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {return }
if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl)
}
Thanks in advance!