Post

Replies

Boosts

Views

Activity

Accessibility Inspector Element Detection and contrast failures with SwiftUI sheets
I am investigating Accessibility Inspector/XCTest audit results in a SwiftUI app (Target Keeper), without suppressing warnings. Environment: Xcode 27.1 (27A9275), iPadOS 27.0 Simulator, macOS 27.0.1. Debug and Release builds pass. The app uses scalable text and labeled controls. Element Detection / native sheet Main-screen Element Detection passes when the sheet is closed. With a SwiftUI .sheet presented, the iPad audit reports “Potentially inaccessible text”; XCUIAccessibilityAuditIssue.element is nil. Exported Inspector HTML highlights background labels behind/outside the sheet, rather than a foreground control. The separate, data-free SwiftUI application below reproduces the modal-only warning; it links no application modules or persistence. Actual iPad Simulator VoiceOver testing using XCUIDevice.shared.voiceOverService passes forward/backward traversal of the real application's modal controls, without reaching the background labels. This is simulator evidence, not physical-device acceptance. A trial explicit modal container/.isModal trait did not clear the audit and was reverted; no warnings are filtered. Minimal independent app: import SwiftUI @main struct ModalRepro: App { @State private var showing=false private let names=["Vegetables","Protein","Fruit","Dairy","Grains","Healthy Fats"] var body:some Scene {WindowGroup { NavigationStack { VStack(spacing:24) { Button("Nutrition") {}.accessibilityLabel("Choose Page").accessibilityValue("Nutrition") LazyVGrid(columns:[GridItem(.flexible()),GridItem(.flexible()),GridItem(.flexible())],spacing:40) { ForEach(names,id:\.self) { name in Button {} label: { VStack(spacing:10) { Circle().fill(.blue.opacity(0.3)).frame(width:250,height:250) Text(name).font(.system(size:17)).accessibilityHidden(true) } }.buttonStyle(.plain).accessibilityLabel(name) } } Button("Show modal") {showing=true} }.padding(24).frame(maxWidth:.infinity,maxHeight:.infinity).background(Color.black) }.preferredColorScheme(.dark) .sheet(isPresented:$showing) { NavigationStack { VStack {Text("Foreground content");Button("Close") {showing=false}} .frame(maxWidth:.infinity,maxHeight:.infinity).background(Color.black) .navigationTitle("Modal flow") }.preferredColorScheme(.dark) } }} }In an Xcode UI-test target, launch this app, run try app.performAccessibilityAudit(for: [.elementDetection]), tap “Show modal”, then run the same audit again. The first passes and the second fails. No issue handler ignores failures. Contrast / scrolling — separate unresolved finding All four iPhone combined-audit configurations (portrait/landscape, normal/maximum Dynamic Type) pass in the tested picker state. However, iPad maximum-text combined audits and a separate scrolled iPhone maximum-text landscape contrast audit still fail; we are not calling these resolved. In the scrolled iPhone case, XCTest identifies a count label whose frame is entirely above the visible results viewport. Inspector's exported HTML reports 1.37:1 using #252526 versus #000000; its marked screenshot rectangle overlaps the dark search/header area, not visible count text. Visible sampled labels instead have white or light foregrounds on opaque dark fills (e.g. #FFFFFF/#1C1C1E = 17.01:1; #98989F/#1C1C1E = 5.94:1). These are screenshot core-pixel measurements, not proof every warning is false. We compare ordinary text against 4.5:1 and interactive non-text against 3:1. iPad maximum-text warnings have not yet been matched to an exact visible color pair. Original failures and HTML exports are preserved privately. Questions Is Element Detection expected to inspect background elements behind a presented native SwiftUI sheet? Is this a known tool limitation/framework issue, or does the sample need different semantics? What is the supported way to establish modal accessibility boundaries with SwiftUI sheets, and when should .isModal be added explicitly? How should we distinguish a real contrast defect from clipping, occlusion, translucency, or sampling of an offscreen element? Which Inspector export fields/diagnostics should establish the actual sampled text/background pair? What additional evidence/manual and physical-device tests does Apple recommend before qualifying accessibility when the minimal audit reproduction fails but actual VoiceOver modal focus behaves correctly? We are not asking to waive audits or declare full accessibility from a VoiceOver pass alone. I read Apple's audit guidance and modal trait documentation: https://developer.apple.com/documentation/accessibility/performing-accessibility-audits-for-your-app https://developer.apple.com/documentation/swiftui/accessibilitytraits/ismodal https://developer.apple.com/help/app-store-connect/manage-app-accessibility/sufficient-contrast-evaluation-criteria/ Related discussion https://developer.apple.com/forums/thread/823968 recommends Feedback for a different apparent Dynamic Type false positive; it does not answer these modal/contrast questions. A Feedback draft is prepared but not submitted, so I have no Feedback ID yet. No private data, identifiers, credentials, app containers or confidential application source are included.
0
0
68
7h
Recovery qualification before updating a development app: encrypted Finder backup and container export
I am qualifying a data-preserving update of my own development-signed iOS/iPadOS app (Target Keeper). I would like to understand the supported recovery guarantees and limitations before changing an existing installation, rather than treating a completed backup or successful model-open test as proof of full rollback. Environment: iOS/iPadOS 27.0.1 and Xcode 27.1. Existing development installations must be retained. The original signed packages for the older installed builds are unavailable. No update, uninstall, device erase or restore has been performed as part of this qualification. Evidence already retained privately: Completed encrypted Finder backup records for each device, with the password kept private. Apple Device Hub downloads of each existing app-data container, retained separately with file counts and SHA-256 manifests. Disposable copies of the actual prior SwiftData store, relevant WAL/SHM files, preferences and selected-photo data opened using the proposed version's existing model and guarded local-startup implementation. Model identities/content fingerprints were unchanged in those tests. The separate Codable Portfolio repository passed loading/reopening on disposable copies without changing the ledger bytes. Controlled process interruption/reopen tests passed on disposable local copies. These tests did not run the entire signed app-update lifecycle on a physical device, validate Keychain continuity, establish an atomic source-side multi-store snapshot, or test restore on the original devices. CloudKit records are not being mutated. I have read Apple's update-testing and container-download/replace guidance: https://developer.apple.com/documentation/xcode/testing-a-release-build https://help.apple.com/xcode/mac/current/en.lproj/dev816c242e1.html Specific questions: For a locally development-signed app that is not available from the App Store, what does an encrypted Finder backup preserve and what additional artifacts are needed to recover the usable app and its data if the original signed app package is missing? Does a backup completion record establish anything about restoration of that development executable? What consistency guarantees does Device Hub's app-container download provide when the app has multiple stores (SwiftData/SQLite with WAL, a separate JSON ledger, preferences and photos)? Is a quiescent/terminated app required, and what is the recommended way to qualify a coherent capture without modifying the original records? What is Apple's recommended recovery rehearsal on a disposable device/installation before an in-place update? Which identity, signing, file-protection and Keychain limitations must be considered, especially for ThisDeviceOnly items and same-device versus different-device restoration? Which preservation checks remain the developer's responsibility beyond successful container replacement or store opening? I do not want to mistake reinstalling an app binary for rolling back a migrated multi-store data set. Separately, an earlier strict source read rejected a file-metadata change, but its paired content hashes were not retained. I am not asserting an Apple defect, corruption or an identified writer, and newer successful copies cannot reconstruct that missing observation. Is there a recommended narrowly scoped Apple diagnostic for future capture that records before/after file identity and content consistency without weakening integrity rejection? No backups, passwords, personal device identifiers, private certificates, record contents or confidential logs are attached. I am seeking a supported qualification procedure, not instructions to bypass preservation safeguards or destructively test on the original devices.
0
0
46
13h
Verify historical Keychain access groups of an existing iOS development installation
I am preparing a data-preserving, same-bundle-identifier update of my own development-signed iOS/iPadOS app (Target Keeper). Existing installations contain records that must be preserved. No update has been attempted, and no Keychain loss or entitlement incompatibility has been demonstrated. Environment: iOS/iPadOS 27.0.1 and Xcode 27.1. The original signed packages/archives for the installed older builds are no longer available. The proposed update has a valid Development signature and a profile covering the test devices. Its signed application identifier, Team identifier and Keychain groups have been inspected locally. The current and a retained later source snapshot use a bundle-derived service and a generic-password query without an explicit kSecAttrAccessGroup, with kSecAttrSynchronizable false and WhenUnlockedThisDeviceOnly accessibility. However, those source snapshots are not authenticated as the source used to produce the older installed binaries. I am therefore not assuming they prove the older effective groups or App ID prefix. I have read Sharing access to keychain items among a collection of apps, TN2415, QA1726, TN2311, and SecItem: Pitfalls and Best Practices: https://developer.apple.com/documentation/security/sharing-access-to-keychain-items-among-a-collection-of-apps https://developer.apple.com/library/archive/technotes/tn2415/_index.html https://developer.apple.com/library/archive/qa/qa1726/_index.html https://developer.apple.com/library/archive/technotes/tn2311/_index.html https://developer.apple.com/forums/thread/724013 These explain the access-group rules, first-group default and service/query distinctions. My remaining question is how to obtain authoritative evidence for the already-installed older app when its original signed package is missing. Is there a supported Xcode, Device Hub, devicectl or other Apple workflow to read/authenticate the effective application-identifier, Team and keychain-access-groups (including relevant App Groups) of an existing development installation without replacing it or extracting any Keychain values? If a local provisioning/install receipt can help, what establishes that it belongs to the installed binary rather than merely showing what a candidate profile permits? If no supported read-only method exists, what minimal controlled diagnostic does Apple recommend to qualify same-app Keychain continuity while preserving the original installation? Please distinguish methods requiring app launch/debugger attachment from genuinely read-only device-management inspection. Available app metadata and an exported app-data container have not supplied a signed entitlement list in the checks performed. Matching the candidate Team and bundle ID alone is not being treated as proof. A cross-bundle shipping migration is a separate problem and is not being attempted here. I am not asking to bypass code-signing or Keychain access controls, broaden access groups, uninstall the old app, or dump credentials. No passwords, certificates/private keys, device identifiers, backup files or application records are attached.
0
0
45
14h
Accessibility Inspector Element Detection and contrast failures with SwiftUI sheets
I am investigating Accessibility Inspector/XCTest audit results in a SwiftUI app (Target Keeper), without suppressing warnings. Environment: Xcode 27.1 (27A9275), iPadOS 27.0 Simulator, macOS 27.0.1. Debug and Release builds pass. The app uses scalable text and labeled controls. Element Detection / native sheet Main-screen Element Detection passes when the sheet is closed. With a SwiftUI .sheet presented, the iPad audit reports “Potentially inaccessible text”; XCUIAccessibilityAuditIssue.element is nil. Exported Inspector HTML highlights background labels behind/outside the sheet, rather than a foreground control. The separate, data-free SwiftUI application below reproduces the modal-only warning; it links no application modules or persistence. Actual iPad Simulator VoiceOver testing using XCUIDevice.shared.voiceOverService passes forward/backward traversal of the real application's modal controls, without reaching the background labels. This is simulator evidence, not physical-device acceptance. A trial explicit modal container/.isModal trait did not clear the audit and was reverted; no warnings are filtered. Minimal independent app: import SwiftUI @main struct ModalRepro: App { @State private var showing=false private let names=["Vegetables","Protein","Fruit","Dairy","Grains","Healthy Fats"] var body:some Scene {WindowGroup { NavigationStack { VStack(spacing:24) { Button("Nutrition") {}.accessibilityLabel("Choose Page").accessibilityValue("Nutrition") LazyVGrid(columns:[GridItem(.flexible()),GridItem(.flexible()),GridItem(.flexible())],spacing:40) { ForEach(names,id:\.self) { name in Button {} label: { VStack(spacing:10) { Circle().fill(.blue.opacity(0.3)).frame(width:250,height:250) Text(name).font(.system(size:17)).accessibilityHidden(true) } }.buttonStyle(.plain).accessibilityLabel(name) } } Button("Show modal") {showing=true} }.padding(24).frame(maxWidth:.infinity,maxHeight:.infinity).background(Color.black) }.preferredColorScheme(.dark) .sheet(isPresented:$showing) { NavigationStack { VStack {Text("Foreground content");Button("Close") {showing=false}} .frame(maxWidth:.infinity,maxHeight:.infinity).background(Color.black) .navigationTitle("Modal flow") }.preferredColorScheme(.dark) } }} }In an Xcode UI-test target, launch this app, run try app.performAccessibilityAudit(for: [.elementDetection]), tap “Show modal”, then run the same audit again. The first passes and the second fails. No issue handler ignores failures. Contrast / scrolling — separate unresolved finding All four iPhone combined-audit configurations (portrait/landscape, normal/maximum Dynamic Type) pass in the tested picker state. However, iPad maximum-text combined audits and a separate scrolled iPhone maximum-text landscape contrast audit still fail; we are not calling these resolved. In the scrolled iPhone case, XCTest identifies a count label whose frame is entirely above the visible results viewport. Inspector's exported HTML reports 1.37:1 using #252526 versus #000000; its marked screenshot rectangle overlaps the dark search/header area, not visible count text. Visible sampled labels instead have white or light foregrounds on opaque dark fills (e.g. #FFFFFF/#1C1C1E = 17.01:1; #98989F/#1C1C1E = 5.94:1). These are screenshot core-pixel measurements, not proof every warning is false. We compare ordinary text against 4.5:1 and interactive non-text against 3:1. iPad maximum-text warnings have not yet been matched to an exact visible color pair. Original failures and HTML exports are preserved privately. Questions Is Element Detection expected to inspect background elements behind a presented native SwiftUI sheet? Is this a known tool limitation/framework issue, or does the sample need different semantics? What is the supported way to establish modal accessibility boundaries with SwiftUI sheets, and when should .isModal be added explicitly? How should we distinguish a real contrast defect from clipping, occlusion, translucency, or sampling of an offscreen element? Which Inspector export fields/diagnostics should establish the actual sampled text/background pair? What additional evidence/manual and physical-device tests does Apple recommend before qualifying accessibility when the minimal audit reproduction fails but actual VoiceOver modal focus behaves correctly? We are not asking to waive audits or declare full accessibility from a VoiceOver pass alone. I read Apple's audit guidance and modal trait documentation: https://developer.apple.com/documentation/accessibility/performing-accessibility-audits-for-your-app https://developer.apple.com/documentation/swiftui/accessibilitytraits/ismodal https://developer.apple.com/help/app-store-connect/manage-app-accessibility/sufficient-contrast-evaluation-criteria/ Related discussion https://developer.apple.com/forums/thread/823968 recommends Feedback for a different apparent Dynamic Type false positive; it does not answer these modal/contrast questions. A Feedback draft is prepared but not submitted, so I have no Feedback ID yet. No private data, identifiers, credentials, app containers or confidential application source are included.
Replies
0
Boosts
0
Views
68
Activity
7h
Recovery qualification before updating a development app: encrypted Finder backup and container export
I am qualifying a data-preserving update of my own development-signed iOS/iPadOS app (Target Keeper). I would like to understand the supported recovery guarantees and limitations before changing an existing installation, rather than treating a completed backup or successful model-open test as proof of full rollback. Environment: iOS/iPadOS 27.0.1 and Xcode 27.1. Existing development installations must be retained. The original signed packages for the older installed builds are unavailable. No update, uninstall, device erase or restore has been performed as part of this qualification. Evidence already retained privately: Completed encrypted Finder backup records for each device, with the password kept private. Apple Device Hub downloads of each existing app-data container, retained separately with file counts and SHA-256 manifests. Disposable copies of the actual prior SwiftData store, relevant WAL/SHM files, preferences and selected-photo data opened using the proposed version's existing model and guarded local-startup implementation. Model identities/content fingerprints were unchanged in those tests. The separate Codable Portfolio repository passed loading/reopening on disposable copies without changing the ledger bytes. Controlled process interruption/reopen tests passed on disposable local copies. These tests did not run the entire signed app-update lifecycle on a physical device, validate Keychain continuity, establish an atomic source-side multi-store snapshot, or test restore on the original devices. CloudKit records are not being mutated. I have read Apple's update-testing and container-download/replace guidance: https://developer.apple.com/documentation/xcode/testing-a-release-build https://help.apple.com/xcode/mac/current/en.lproj/dev816c242e1.html Specific questions: For a locally development-signed app that is not available from the App Store, what does an encrypted Finder backup preserve and what additional artifacts are needed to recover the usable app and its data if the original signed app package is missing? Does a backup completion record establish anything about restoration of that development executable? What consistency guarantees does Device Hub's app-container download provide when the app has multiple stores (SwiftData/SQLite with WAL, a separate JSON ledger, preferences and photos)? Is a quiescent/terminated app required, and what is the recommended way to qualify a coherent capture without modifying the original records? What is Apple's recommended recovery rehearsal on a disposable device/installation before an in-place update? Which identity, signing, file-protection and Keychain limitations must be considered, especially for ThisDeviceOnly items and same-device versus different-device restoration? Which preservation checks remain the developer's responsibility beyond successful container replacement or store opening? I do not want to mistake reinstalling an app binary for rolling back a migrated multi-store data set. Separately, an earlier strict source read rejected a file-metadata change, but its paired content hashes were not retained. I am not asserting an Apple defect, corruption or an identified writer, and newer successful copies cannot reconstruct that missing observation. Is there a recommended narrowly scoped Apple diagnostic for future capture that records before/after file identity and content consistency without weakening integrity rejection? No backups, passwords, personal device identifiers, private certificates, record contents or confidential logs are attached. I am seeking a supported qualification procedure, not instructions to bypass preservation safeguards or destructively test on the original devices.
Replies
0
Boosts
0
Views
46
Activity
13h
Verify historical Keychain access groups of an existing iOS development installation
I am preparing a data-preserving, same-bundle-identifier update of my own development-signed iOS/iPadOS app (Target Keeper). Existing installations contain records that must be preserved. No update has been attempted, and no Keychain loss or entitlement incompatibility has been demonstrated. Environment: iOS/iPadOS 27.0.1 and Xcode 27.1. The original signed packages/archives for the installed older builds are no longer available. The proposed update has a valid Development signature and a profile covering the test devices. Its signed application identifier, Team identifier and Keychain groups have been inspected locally. The current and a retained later source snapshot use a bundle-derived service and a generic-password query without an explicit kSecAttrAccessGroup, with kSecAttrSynchronizable false and WhenUnlockedThisDeviceOnly accessibility. However, those source snapshots are not authenticated as the source used to produce the older installed binaries. I am therefore not assuming they prove the older effective groups or App ID prefix. I have read Sharing access to keychain items among a collection of apps, TN2415, QA1726, TN2311, and SecItem: Pitfalls and Best Practices: https://developer.apple.com/documentation/security/sharing-access-to-keychain-items-among-a-collection-of-apps https://developer.apple.com/library/archive/technotes/tn2415/_index.html https://developer.apple.com/library/archive/qa/qa1726/_index.html https://developer.apple.com/library/archive/technotes/tn2311/_index.html https://developer.apple.com/forums/thread/724013 These explain the access-group rules, first-group default and service/query distinctions. My remaining question is how to obtain authoritative evidence for the already-installed older app when its original signed package is missing. Is there a supported Xcode, Device Hub, devicectl or other Apple workflow to read/authenticate the effective application-identifier, Team and keychain-access-groups (including relevant App Groups) of an existing development installation without replacing it or extracting any Keychain values? If a local provisioning/install receipt can help, what establishes that it belongs to the installed binary rather than merely showing what a candidate profile permits? If no supported read-only method exists, what minimal controlled diagnostic does Apple recommend to qualify same-app Keychain continuity while preserving the original installation? Please distinguish methods requiring app launch/debugger attachment from genuinely read-only device-management inspection. Available app metadata and an exported app-data container have not supplied a signed entitlement list in the checks performed. Matching the candidate Team and bundle ID alone is not being treated as proof. A cross-bundle shipping migration is a separate problem and is not being attempted here. I am not asking to bypass code-signing or Keychain access controls, broaden access groups, uninstall the old app, or dump credentials. No passwords, certificates/private keys, device identifiers, backup files or application records are attached.
Replies
0
Boosts
0
Views
45
Activity
14h