I'm making a wrapper library to abstract away some of the 'missing platform support' of DeclaredAgeRange until hopefully it expands to additional platforms.
When I'm trying to fully enumerate all of the cases of AgeRangeDeclaration, which they all state available starting 26.0 (mysteriously added in Xcode 26.2 beta), the app crashes due to a missing symbol at launch time. This happens both for Xcode 26.1, 26.2 beta 2, and matching Xcode Cloud builds. So I've isolated it beyond "doesn't work on my machine".
I just made a handful of crashes and attached a sysdiagnose to a fresh feedback.
FB21121092 - DeclaredAgeRange: Eligibility property and new declaration cases unavailable on iOS 26.1 device contradicting documentation - causes runtime symbol not found crash
If anyone is curious what these crashes look like I've attached the DiagnosticPayload.jsonRepresentation() generated from one of my favorite frameworks, MetricKit.
Very clearly articulated in the diagnostic metadata you can see the symbol not found.
"diagnosticMetaData" : {
"platformArchitecture" : "arm64e",
"terminationReason" : "Symbol not found: _$s16DeclaredAgeRange0bC7ServiceV0bC11DeclarationO14paymentCheckedyA2EmFWC\nReferenced from: <1894EDCB-3263-3604-8938-97D465FF3720> \/Volumes\/VOLUME\/*\/PerformanceOrganizer.app\/PerformanceOrganizer\nExpected in: <B8FD2C23-0CC9-3D94-902D-875900307A7A> \/System\/Library\/Frameworks\/DeclaredAgeRange.framework\/DeclaredAgeRange",
"exceptionType" : 10,
"appBuildVersion" : "745",
"isTestFlightApp" : true,
"osVersion" : "iPhone OS 26.1 (23B85)",
"bundleIdentifier" : "dev.twincitiesapp.performanceorganizer",
"deviceType" : "iPhone18,1",
"exceptionCode" : 0,
"signal" : 6,
"regionFormat" : "US",
"appVersion" : "2.0.0",
"pid" : 22987,
"lowPowerModeEnabled" : false
}
This is the offending code in a type I control and make available on other platforms but leave unused.
extension AgeRangeDeclaration {
// A factory or initializer that takes the AgeRangeService.AgeRangeDeclaration and maps to the common AgeRangeDeclaration type
public init?(platform value: AgeRangeService.AgeRangeDeclaration?) {
guard let value else {
return nil
}
switch value {
// Xcode 26.1 visible cases
case .selfDeclared:
self = .selfDeclared
case .guardianDeclared:
self = .guardianDeclared
// Xcode 26.2 visible cases
// This is the first culprit, all of the following symbols would crash, this is just the first
case .checkedByOtherMethod:
self = .checkedByOtherMethod
case .guardianCheckedByOtherMethod:
self = .guardianCheckedByOtherMethod
case .governmentIDChecked:
self = .governmentIDChecked
case .guardianGovernmentIDChecked:
self = .guardianGovernmentIDChecked
case .paymentChecked:
self = .paymentChecked
case .guardianPaymentChecked:
self = .guardianPaymentChecked
@unknown default:
// Apple added new cases in Xcode 26.2 betas that were available in iOS 26.0,
// so it is probable that this could happen again. If it does, assert to let developers
// bring it to my attention.
assertionFailure("Invalid or out of date knowledge of age range declaration \(value)")
self = .unknown
}
}
}
For what it is worth, the same is also true for isEligibleForAgeFeatures which I suspect was also added to Xcode 26.2 somehow but not made available to real devices running [26.0 - 26.2).
As a side note, thank you for this property, it will let me check what states I need to perform extra checks for in a clean way, I just will need it to now not crash my app on 26.0 and 26.1 runtime devices. :)
Edit:
DTS did confirm on a comment I had in another thread that this is a bug. Now just to wait for an Xcode beta update. https://developer.apple.com/forums/thread/807906?answerId=867205022#867205022
In any case, this is a great example of how MetricKit totally rocks capturing things other off the shelf crash tools might not have a chance to get. I did have to roll back my TestFlight to an earlier build, but MetricKit was there to send me the previous crashes as soon as the app could launch. Thanks MetricKit team!