Additions for expo-age-range alpha
Asaph Tsegay
### Summary
As an active educational application (
com.senaysoft.*
), we are implementing the alpha expo-age-range
module to comply with emerging state-level age-assurance regulations. While the Android implementation (Play Age Signals) is working perfectly, the iOS implementation currently forces a steep architectural and UX trade-off due to two major blockers. We are currently forced to exclude the package from our iOS autolinking to maintain our build pipeline. We are opening this issue/discussion to highlight the exact friction points preventing production adoption on iOS.
### Blocker 1: Xcode 16 / Swift 6 Strict Concurrency Failures
Standard EAS build environments utilizing Xcode 16 / iOS 26 SDK enforce strict Swift 6 concurrency by default. The current
expo-age-range
alpha pod does not pass these checks.The Failure:
During the
Run fastlane
step, the compiler throws the following error inside the ExpoAgeRange
target:task or actor isolated value cannot be sent
Current Workarounds (Both Fragile):
- Abandon the iOS implementation entirely via expo.autolinking.ios.exclude.
- Write a custom Config Plugin utilizing @expo/config-plugins(withDangerousMod) to inject Ruby into thepost_installPodfile block, forcingSWIFT_STRICT_CONCURRENCY = 'minimal'for the pod.
The Request:
Please update the internal Swift files (
AgeRangeModule.swift
, etc.) to comply with Apple's actor isolation rules or apply @preconcurrency
annotations so standard EAS cloud builds compile cleanly out of the box.### Blocker 2: JS Exposure of Jurisdiction Eligibility (
isEligibleForAgeFeaturesAsync
)To prevent severe UX degradation for a global educational app, we need to be able to silently bypass the native age gate modal for users in non-regulated regions.
The Issue:
Because the alpha module currently lacks JavaScript access to Apple's
isEligibleForAgeFeaturesAsync()
pre-check (or equivalent), our fallback logic must aggressively fire requestAgeRangeAsync()
for every single user
globally running iOS 26+.The Request:
Prioritize exposing the eligibility check to the JS bridge. This is critical for allowing us to ping the OS ("Is this user in a regulated jurisdiction?") before needlessly triggering the native Apple age gate for global users who fall outside the scope of Texas/Utah/Louisiana laws.
### Environment
- Expo SDK: 54 (Alpha track)
- React Native: 0.81.5
- Package: expo-age-range(~0.2.1)
- Platform: iOS (EAS Build / Xcode 16)
kudochien
hi there! both xcode 16 and
isEligibleForAgeFeaturesAsync
are supported on the latest expo-age-range version. we don't backport new features to older sdks. please try to upgrade sdk 56. if upgrading sdk isn't feasible, you could try use expo-age-range@~56.0.5
. it doesn't have much breaking changes and may work upon sdk 54. that's not highly recommended but uses with some risk. i hope it works for you.