age_range_signals
Flutter plugin for age verification supporting Google Play Age Signals API (Android) and Apple's Age Range (DeclaredAgeRange) API (iOS 26+).
What this package is like to depend on
Last release 25 days ago
29 Jul 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 16 of 16 stable releases
Nothing withdrawn
no release was ever pulled
8 months old
16 releases · first in 2025
16 releases in the last 12 months
see the full history below
Release timeline
16 releases · Dec 2025 to Jul 2026Releases
latest 16-
0.8.029 Jul 2026Release notes
Open source →Migrates Android to Play age-signals 0.0.4, which removed the library's
userStatus. Reading age signals is now two calls, andstatusis derived from the reported age band measured against your highest age gate rather than from the assurance tier.Thanks to @syntaxticsugr, who did the 0.0.4 migration in #34 and reviewed the merged result in #35.
Breaking
statusnow comes from the reported age band, not the assurance tier. PassageGateson Android too; it uses 18 until you do.AgeSignalsStatus.declaredis deprecated and no longer returned; readageRangeSource == AgeRangeSource.tierAinstead.- Renamed
mostRecentApprovalDatetosignificantChangeApprovalDate, matching the upstream rename. The old name still works as a deprecated alias, andfromMapaccepts the old key. useMockData: truenow throwsMockDataNotAllowedExceptionoutside debuggable builds.AgeSignalsStatusandAgeDeclarationSourcegained values, so exhaustive switches need new cases.
New
requestAgeSignalsAccess(), the first of the two calls. Returnsshared,notSharedorverificationRequired. On iOS it returnsshared, since Apple gathers consent insidecheckAgeSignals().AgeSignalsResult.ageRangeSource(tierA-tierD) andsignificantChangeStatus.
Migrating
See Migrating to 0.8.0 for the before and after, plus notes for 0.6.x and 0.5.x.
Full changelog: 0.7.0...0.8.0
Release notes
Open source →- Android: Migrated to
com.google.android.play:age-signals0.0.4, which removesuserStatusin favour ofageRangeSourceandsignificantChangeStatus. - Android: Added
requestAgeSignalsAccess(), the first of 0.0.4's two calls. It may show Play's in-app sharing prompt (the plugin is nowActivityAware) and returnsshared,notSharedorverificationRequired. Call it beforecheckAgeSignals(). - iOS:
requestAgeSignalsAccess()returnsshared, since Apple gathers consent insidecheckAgeSignals(), but it raises the version and initialization errorscheckAgeSignals()used to raise. Widen yourtryto cover both calls. - Android:
AgeSignalsResultnow exposesageRangeSource(tierA-tierD) andsignificantChangeStatus. - Breaking:
statusnow comes from the reported age band measured against your highest age gate, not from the assurance tier. PassageGateson Android too; it uses 18 until you do. - Breaking:
AgeSignalsStatus.declaredis deprecated and no longer returned; readageRangeSource == AgeRangeSource.tierAinstead. - Breaking: Renamed
mostRecentApprovalDatetosignificantChangeApprovalDate, matching the upstream rename. The old name still works as a deprecated alias, andfromMapaccepts the old key. - Breaking:
useMockData: truenow throwsMockDataNotAllowedExceptionoutside debuggable builds, so a release can't reach the fake manager. - Android:
AgeSignalsMockDatagainedaccessStatusplus explicitageRangeSource/significantChangeStatusoverrides. - Docs: Refreshed regulatory status (Texas in effect; Utah and Louisiana delayed to 2027, though Apple already shares age categories there; Singapore added). Added badges,
context7.jsonandllms.txt. - Example: Added the access step and a mock-data toggle for hitting the real API on device.
-
0.7.004 Jul 2026Release notes
Open source →What's Changed
- iOS: Added
getRequiredRegulatoryFeatures()(iOS 26.4+), which reports whether Apple requires the current user to share an age range and whether significant-change notification or parental consent applies (#31). Calls are guarded by a 10-second deadline. ThrowsUnsupportedPlatformExceptionbelow iOS 26.4 (and in apps built with an SDK older than iOS 26.4) so an empty set always means Apple affirmatively reports nothing is required; on Android the set is always empty. - iOS: Added
showSignificantUpdateAcknowledgment(updateDescription:), the system sheet for significant app changes (iOS 26.4+). ThrowsUnsupportedPlatformExceptionwhere unavailable instead of silently succeeding. - iOS:
AgeSignalsResultnow includesactiveParentalControls. - Android:
AgeSignalsResultnow includesmostRecentApprovalDate; mockable viaAgeSignalsMockData. - iOS:
checkAgeSignals()now reportsApiNotAvailableExceptionwhen Apple says age range sharing is unavailable for the user or region. Earlier versions misreported that state asMissingEntitlementExceptioneven on correctly entitled apps. - iOS:
PRESENTATION_CONTEXT_UNAVAILABLEerrors now surface asApiErrorExceptioninstead of the baseAgeSignalsException. - Docs: Documented Apple's rule that age gates must be at least 2 years apart.
- Example: The iOS example now wires
Runner.entitlementsinto signing viaCODE_SIGN_ENTITLEMENTS(it was previously never applied) and adds buttons for the regulatory features API.
Full Changelog: 0.6.2...0.7.0
Release notes
Open source →- iOS: Added
getRequiredRegulatoryFeatures()(iOS 26.4+), which reports whether Apple requires the current user to share an age range and whether significant-change notification or parental consent applies (#31). Calls are guarded by a 10-second deadline. ThrowsUnsupportedPlatformExceptionbelow iOS 26.4 (and in apps built with an SDK older than iOS 26.4) so an empty set always means Apple affirmatively reports nothing is required; on Android the set is always empty. - iOS: Added
showSignificantUpdateAcknowledgment(updateDescription:), the system sheet for significant app changes (iOS 26.4+). ThrowsUnsupportedPlatformExceptionwhere unavailable instead of silently succeeding. - iOS:
AgeSignalsResultnow includesactiveParentalControls. - Android:
AgeSignalsResultnow includesmostRecentApprovalDate; mockable viaAgeSignalsMockData. - iOS:
checkAgeSignals()now reportsApiNotAvailableExceptionwhen Apple says age range sharing is unavailable for the user or region. Earlier versions misreported that state asMissingEntitlementExceptioneven on correctly entitled apps. - iOS:
PRESENTATION_CONTEXT_UNAVAILABLEerrors now surface asApiErrorExceptioninstead of the baseAgeSignalsException. - Docs: Documented Apple's rule that age gates must be at least 2 years apart.
- Example: The iOS example now wires
Runner.entitlementsinto signing viaCODE_SIGN_ENTITLEMENTS(it was previously never applied) and adds buttons for the regulatory features API.
- iOS: Added
-
0.6.202 Jul 2026Release notes
Open source →What's Changed
- Android: Fixed the Gradle build on hosts not using AGP 9 built-in Kotlin. The Kotlin plugin is now applied only when the host needs it (AGP <9, or
android.builtInKotlin=false), so the plugin works with AGP 9 built-in Kotlin as well as AGP 8.x + KGP 2.0+. No changes required in consuming apps. - Android: Removed the unused standalone Gradle wrapper from
android/. - Docs: Added an integration levels table (#30), consolidated regulatory status into one section, fixed broken table-of-contents links, and clarified why iOS never returns
supervisedApprovalDenied(#24).
Full Changelog: 0.6.1...0.6.2
Release notes
Open source →- Android: Fixed the Gradle build on hosts not using AGP 9 built-in Kotlin. The Kotlin plugin is now applied only when the host needs it (AGP <9, or
android.builtInKotlin=false), so the plugin works with AGP 9 built-in Kotlin as well as AGP 8.x + KGP 2.0+. No changes required in consuming apps. - Android: Removed the unused standalone Gradle wrapper from
android/. - Docs: Added an integration levels table (#30), consolidated regulatory status into one section, fixed broken table-of-contents links, and clarified why iOS never returns
supervisedApprovalDenied(#24).
- Android: Fixed the Gradle build on hosts not using AGP 9 built-in Kotlin. The Kotlin plugin is now applied only when the host needs it (AGP <9, or
-
0.6.105 Jun 2026Release notes
Open source →What's Changed
- iOS: Fixed SwiftPM build failure from 0.6.0 caused by a wrong argument order in
Package.swift. CocoaPods was not affected. - Example: Migrated the iOS example to Swift Package Manager (dropped CocoaPods).
Full Changelog: 0.6.0...0.6.1
Release notes
Open source →- iOS: Fixed SwiftPM build failure from 0.6.0 caused by a wrong argument order in
Package.swift. CocoaPods was not affected. - Example: Migrated the iOS example to Swift Package Manager (dropped CocoaPods).
- iOS: Fixed SwiftPM build failure from 0.6.0 caused by a wrong argument order in
-
0.6.005 Jun 2026Release notes
Open source →What's Changed
- iOS: Fixed
checkAgeSignals()hanging indefinitely on iOS 26.2+. The plugin no longer gates on Apple'sisEligibleForAgeFeatures(which can hang, and returnsfalsebefore any prompt is accepted); it callsrequestAgeRange()directly, per Apple's guidance.- Breaking: iOS no longer returns
AgeSignalsStatus.unknownfrom the eligibility pre-check. Region eligibility is now reflected byrequestAgeRange()itself.
- Breaking: iOS no longer returns
- Android: Raised
minSdkfrom 21 to 23 (thecom.google.android.play:age-signalsAAR declaresminSdkVersion 23; lower values fail the Gradle manifest merge). - Android: Fixed
useMockData: truereturningAPI_NOT_AVAILABLEwhen Play Services is unavailable; the mock path now runs independently of the real manager. - Android: Mock data can now reproduce the open-ended top bucket (
ageLower=18, ageUpper=null). - Build: Migrated to AGP 9 built-in Kotlin support and raised the minimums to Flutter 3.44 / Dart 3.12. Declared the
FlutterFrameworkdependency inPackage.swift(required by Flutter 3.41+ SPM; removes the build warning). - Docs: Updated regulatory status (Texas SB 2420 in effect under a temporary stay; Brazil, Australia, and Singapore applicable; Utah and Louisiana delayed to 2027), corrected the Android minimum API to 23, clarified
AgeSignalsResultnullability, and documented the iOS 1-3 age-gate limit. - Example: Updated to AGP 9.0.1 and migrated to the UIScene lifecycle.
Full Changelog: 0.5.1...0.6.0
Release notes
Open source →- iOS: Fixed
checkAgeSignals()hanging indefinitely on iOS 26.2+. The plugin no longer gates on Apple'sisEligibleForAgeFeatures(which can hang, and returnsfalsebefore any prompt is accepted); it callsrequestAgeRange()directly, per Apple's guidance.- Breaking: iOS no longer returns
AgeSignalsStatus.unknownfrom the eligibility pre-check. Region eligibility is now reflected byrequestAgeRange()itself.
- Breaking: iOS no longer returns
- Android: Raised
minSdkfrom 21 to 23 (thecom.google.android.play:age-signalsAAR declaresminSdkVersion 23; lower values fail the Gradle manifest merge). - Android: Fixed
useMockData: truereturningAPI_NOT_AVAILABLEwhen Play Services is unavailable; the mock path now runs independently of the real manager. - Android: Mock data can now reproduce the open-ended top bucket (
ageLower=18, ageUpper=null). - Build: Migrated to AGP 9 built-in Kotlin support and raised the minimums to Flutter 3.44 / Dart 3.12. Declared the
FlutterFrameworkdependency inPackage.swift(required by Flutter 3.41+ SPM; removes the build warning). - Docs: Updated regulatory status (Texas SB 2420 in effect under a temporary stay; Brazil, Australia, and Singapore applicable; Utah and Louisiana delayed to 2027), corrected the Android minimum API to 23, clarified
AgeSignalsResultnullability, and documented the iOS 1-3 age-gate limit. - Example: Updated to AGP 9.0.1 and migrated to the UIScene lifecycle.
- iOS: Fixed
-
0.5.119 Mar 2026Release notes
Open source →What's Changed
- Android: Updated
com.google.android.play:age-signalsto version 0.0.3 (#25, thanks to @nathanael540)- Brazilian Digital ECA Law (Lei 15.211) Support: Version 0.0.3 is required for apps targeting Brazil
- New user status:
DECLAREDfor users who have declared their age through Google Play - Refactored error handling to use structured
AgeSignalsException.errorCodeinstead of string matching - Added
SDK_VERSION_OUTDATEDerror handling
New Contributors
- @nathanael540 made their first contribution in #26
Full Changelog: 0.5.0...0.5.1
Release notes
Open source →- Android: Updated
com.google.android.play:age-signalsto version 0.0.3 (#25, thanks to @nathanael540)- Brazilian Digital ECA Law (Lei 15.211) Support: Version 0.0.3 is required for apps targeting Brazil
- New user status:
DECLAREDfor users who have declared their age through Google Play - Refactored error handling to use structured
AgeSignalsException.errorCodeinstead of string matching - Added
SDK_VERSION_OUTDATEDerror handling
- Android: Updated
-
0.5.027 Dec 2025Release notes
Open source →What's Changed
-
Android: Added
mockDataparameter for customizable testing- New
AgeSignalsMockDataclass allows testing different scenarios - Uses Google's official
FakeAgeSignalsManagerfromcom.google.android.play.agesignals.testingpackage - Can customize status, age ranges, and installId for testing
- Defaults to supervised user (13-15) for backward compatibility with existing tests
- New
-
Documentation: Major updates and improvements
- Added Texas SB 2420 federal court injunction notice (December 23, 2025)
- Comprehensive testing documentation for both platforms
- Clarified that
mockDatais Android-only (iOS has no official testing utilities from Apple) - Updated README with accurate testing requirements and platform-specific limitations
- Improved example app comments to explain platform differences
-
iOS: No changes
- Continues to ignore
useMockDataandmockDataparameters (same as 0.4.2) - Apple does not provide testing utilities for DeclaredAgeRange API
- iOS testing requires real iOS 26.2+ devices with actual Apple IDs
- Continues to ignore
Full Changelog: 0.4.2...0.5.0
Release notes
Open source →-
Android: Added
mockDataparameter for customizable testing- New
AgeSignalsMockDataclass allows testing different scenarios - Uses Google's official
FakeAgeSignalsManagerfromcom.google.android.play.agesignals.testingpackage - Can customize status, age ranges, and installId for testing
- Defaults to supervised user (13-15) for backward compatibility with existing tests
- New
-
Documentation: Major updates and improvements
- Added Texas SB 2420 federal court injunction notice (December 23, 2025)
- Comprehensive testing documentation for both platforms
- Clarified that
mockDatais Android-only (iOS has no official testing utilities from Apple) - Updated README with accurate testing requirements and platform-specific limitations
- Improved example app comments to explain platform differences
-
iOS: No changes
- Continues to ignore
useMockDataandmockDataparameters (same as 0.4.2) - Apple does not provide testing utilities for DeclaredAgeRange API
- iOS testing requires real iOS 26.2+ devices with actual Apple IDs
- Continues to ignore
-
-
0.4.216 Dec 2025Release notes
Open source →What's Changed
- Android: Fixed
ageLowerandageUpperto read actual values from Google Play Age Signals API- Previously these fields were hardcoded to
null, now they correctly return age range values for supervised users - Age ranges are returned as integer bounds (e.g.,
ageLower=13,ageUpper=15for a 13-15 age band) - Values are
nullfor verified users (18+) as expected
- Previously these fields were hardcoded to
- iOS: Simplified plugin implementation
- Example App: Added iOS warning explaining that example app cannot run DeclaredAgeRange API without proper entitlement
- Documentation: Updated README to accurately document mock data behavior (returns supervised_13_15 by default, not verified)
Full Changelog: 0.4.1...0.4.2
Release notes
Open source →- Android: Fixed
ageLowerandageUpperto read actual values from Google Play Age Signals API- Previously these fields were hardcoded to
null, now they correctly return age range values for supervised users - Age ranges are returned as integer bounds (e.g.,
ageLower=13,ageUpper=15for a 13-15 age band) - Values are
nullfor verified users (18+) as expected
- Previously these fields were hardcoded to
- iOS: Simplified plugin implementation
- Example App: Added iOS warning explaining that example app cannot run DeclaredAgeRange API without proper entitlement
- Documentation: Updated README to accurately document mock data behavior (returns supervised_13_15 by default, not verified)
- Android: Fixed
-
0.4.115 Dec 2025Release notes
Open source → -
0.4.015 Dec 2025Release notes
Open source →What's Changed
-
Android: Added distinct status values for guardian approval states (#10, thanks to @kumamotone)
AgeSignalsStatus.supervisedApprovalPending- awaiting guardian responseAgeSignalsStatus.supervisedApprovalDenied- guardian denied access
-
iOS: Added regional eligibility check for iOS 26.2+ (#9, thanks to @rokarnus)
- Returns
AgeSignalsStatus.unknownfor users outside applicable regions - Avoids unnecessary API calls when age verification is not available
- Returns
-
Error Handling: Added 6 new exception types with detailed diagnostics
MissingEntitlementException,ApiErrorException,NetworkErrorExceptionUserCancelledException,PlayServicesException,UserNotSignedInException- All exceptions now include a
detailsfield with platform-specific diagnostic information - Enhanced error detection for Play Services, network issues, authentication, and user cancellation
New Contributors
- @kumamotone made their first contribution in #10
Full Changelog: 0.3.0...0.4.0
Release notes
Open source →-
Android: Added distinct status values for guardian approval states (#10, thanks to @kumamotone)
AgeSignalsStatus.supervisedApprovalPending- awaiting guardian responseAgeSignalsStatus.supervisedApprovalDenied- guardian denied access
-
iOS: Added regional eligibility check for iOS 26.2+ (#9, thanks to @rokarnus)
- Returns
AgeSignalsStatus.unknownfor users outside applicable regions - Avoids unnecessary API calls when age verification is not available
- Returns
-
Error Handling: Added 6 new exception types with detailed diagnostics
MissingEntitlementException,ApiErrorException,NetworkErrorExceptionUserCancelledException,PlayServicesException,UserNotSignedInException- All exceptions now include a
detailsfield with platform-specific diagnostic information - Enhanced error detection for Play Services, network issues, authentication, and user cancellation
-
-
0.3.011 Dec 2025Release notes
Open source →-
IMPORTANT: Critical update to ensure compatibility with Google Play Age Signals API requirements (effective January 1, 2026)
-
Android: ⚠️ Google has updated their requirements again - the Play Age Signals API now requires version
0.0.2or higher (previously0.0.1in v0.2.0). Beta versions and0.0.1will throw exceptions starting January 1, 2026. (thanks to @JenniO for reporting this in #7)- Updated to
com.google.android.play:age-signals:0.0.2(latest required version) - Updated build tools to match Flutter's official plugins for improved compatibility and future-proofing
- Updated to
-
Migration: No code changes required - just update your dependency version in
pubspec.yaml
-
-
0.2.009 Dec 2025Release notes
Open source →-
Android: ⚠️ CRITICAL UPDATE - Bumped Play Age Signals API library version to non-beta stable release
com.google.android.play:age-signals:0.0.1(thanks to @rokarnus for reporting this in #5) -
ACTION REQUIRED: Users must upgrade to version 0.2.0 or higher before January 1, 2026
- Why: From January 1, 2026, all beta versions (0.0.1-beta*) of the Play Age Signals API will throw exceptions
- Impact: Apps using older versions of this plugin (with beta API) will stop working after January 1, 2026
- To receive live responses from January 1, 2026, you must upgrade to this library version (0.2.0 or higher)
-
-
0.1.304 Dec 2025Release notes
Open source →- iOS: Fixed compilation error: renamed
range.sourcetorange.ageRangeDeclarationto match Apple's DeclaredAgeRange API (#3)
- iOS: Fixed compilation error: renamed
-
0.1.202 Dec 2025Release notes
Open source →- iOS: Added Swift Package Manager (SPM) support
- Example: Migrated example project from CocoaPods to Swift Package Manager
-
0.1.101 Dec 2025Release notes
Open source →- Android: Add
useMockDataparameter for testing - iOS: Fix critical
requestAgeRangemethod call syntax - iOS: Add support for 1-3 age gates (previously 2-3)
- iOS: Support for Swift Package Manager
- Add pub.dev topics and formatted code for better score
- Documentation improvements and usage examples
- Android: Add
-
0.1.001 Dec 2025Release notes
Open source →- Initial release
- Support for Google Play Age Signals API on Android (API 21+)
- Support for Apple's DeclaredAgeRange API on iOS (26.0+)
- Configurable age gates for iOS
- Comprehensive example app with mock data support