I am having an issue with VoiceOver not honoring coded Accessibility values (label/hint/ect). I have been able to replicate the issue by changing the Bundle Identifier. My original Bundle Identifier has issues with all VoiceOver Functions. If I append anything to the end of my Bundle Identifier, delete app on iPhone, Clean Project, force close xCode, click on the project, let it build then install the issue is gone. If I rename back to the original Bundle Identifier, delete app on iPhone, force close xCode, click on the project, let it build then install the issue returns. I have tried this process all day trying to isolate the issue. including deleting derived data after force close of xCode but it does not appear to affect either the app with the original Bundle Identifier or the new Bundle Identifier.
While the issue affects the entire app it is very evident on the UITabBarController. VoiceOver on the app with original Bundle Identifier Says the following when touching a Tab Bar Item
"Home Tab Actions Available" or "Home Tab swipe up or down to select a custom action then double tap to activate".
If I swipe voice over reads the Label ("Home") then the icon name if it exists (happens to be "Home" icon) then "Activate Default". If no icon name exists there is no VoiceOver in between label and "Activate Default".
VoiceOver on the app with a new Bundle Identifier Says the following when touching a Tab Bar Item. I believe this is the correct way according to Apple's UITabBar documentation (uikit/uitabbar).
"Selected Home Tab 1 of 3"
The only difference in git is the Bundle Identifier.
myname@name-Mac-mini dretauth (appSignIn) $ git diff
diff --git a/dretauth.xcodeproj/project.pbxproj b/dretauth.xcodeproj/project.pbxproj
index 5a02b2a..ab01473 100644
--- a/dretauth.xcodeproj/project.pbxproj
+++ b/dretauth.xcodeproj/project.pbxproj
@@ -2325,7 +2325,7 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.33;
- PRODUCT_BUNDLE_IDENTIFIER = "com.redacted.dretauth";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.redacted.dretauth.ctest";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -2349,7 +2349,7 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.33;
- PRODUCT_BUNDLE_IDENTIFIER = "com.redacted.dretauth";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.redacted.dretauth.ctest";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
myname@name-Mac-mini dretauth (appSignIn) $
If I search the entire project the only items that have the original bundle ID are the Build Settings, Info.plist, apple-app-site-association (saved in project but only used on server-side), and GoogleService-Info used for firebase notifications/crashlytics.
At this point I'm unsure how to get correct functionality into my app using the original Bundle Identifier. App is in production so changing the Identifier is out of the question. Thanks.
I have spent days betting my head on this one. Purchased a new device and had the issue persist without transfering my apps or settings.
I got an answer from Apple Frameworks Engineer although they said the Screen Recognition Setting is saved at the system level. My guess is Screen Recognition is saved in iCloud or some other synchronized location as the setting persisted on a new device installation. Here is the response from Apple in case anyone runs into this issue. https://developer.apple.com/forums/thread/698009
It sounds to me like you may have inadvertently enabled Screen Recognition for your app. We store this setting by bundle identifier on the system. You can use the rotor (rotate 2 fingers on the screen like you are rotating a dial) to get to Screen Recognition, and then swipe up or down to toggle it on or off. This feature uses machine learning models to attempt to make your app accessible rather than relying on the view hierarchy, which would be why the properties you are setting aren't being respected. If you toggle this off, it'll go back to reading from the view hierarchy.
This setting is difficult to turn on or off, is only available in app when VoiceOver is on. Despite being an Accessibility Feature it does not announce how to adjust the feature there is simply a dial which disappears quickly after a setting is selected. There is no indication that a user should swipe up or down, swiping up or down must be done within one second after you pickup your 2 fingers used to find the settings on a dial. The users fingers are likely in an award position from turning the dial, so it may take a few attempts to change the setting. Anyway I hope this saves someone days of debugging.