- 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.
- 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.
- 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).
- 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
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.
- 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: 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
- 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)
- Fixed code formatting issues to improve pub.dev score
-
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
-
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 version0.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
-
Android:
⚠️ CRITICAL UPDATE - Bumped Play Age Signals API library version to non-beta stable releasecom.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)
- iOS: Fixed compilation error: renamed
range.sourcetorange.ageRangeDeclarationto match Apple's DeclaredAgeRange API (#3)
- iOS: Added Swift Package Manager (SPM) support
- Example: Migrated example project from CocoaPods to Swift Package Manager
- 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
- 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