DeclaredAgeRange framework new cases and properties cause runtime crash with missing symbol

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!

Thanks for filing FB21121092, and also for the neat shout out regarding how MetricKit aided your investigation here.

As to FB21121092, your report made it into the iOS 26.2 RC Release Notes as an acknowledgement of this issue and how it affects developers using the DeclaredAgeRange APIs. There isn't anything that I can share here about the state of our investigation right now, but it is progressing, and I'll provide an update here for the community once I have more information to share.

— Ed Ford,  DTS Engineer

These DeclaredAgeRange issues are blocking my team from completing development on our work to comply with the Texas law that comes into effect on January 1st and effects all apps on the app store ( https://developer.apple.com/news/?id=btkirlj8 ). What progress has been made in the past 6 days?

The crash issue that @edorphy reported in FB21121092 is resolved when you build the app with the released Xcode 26.2 version that came out today, build number 17C52. This version is not the same build as the Xcode 16.2 Release Candidate, so make sure to update to the final release version.

@edorphy, had a follow-up statement to me for a different but related issue:

you or others may have already seen this one but just in case you haven't: FB21240249 - DeclaredAgeRange: DeclaredAgeRangeAction symbol unavailable on macOS catalyst apps causing crash - documentation says otherwise

I appreciate that! I personally had not seen this report, though others within Apple have. We're looking in to it.

— Ed Ford,  DTS Engineer

DeclaredAgeRange framework new cases and properties cause runtime crash with missing symbol
 
 
Q