更新记录

1.0.1(2026-07-24)

1.0.0(2026-07-24)

  • 首次发布
  • 新增 iOS 端 requestAgeRange 接口,调用 Apple DeclaredAgeRange 框架获取用户声明年龄范围
  • 支持传入最多 3 个年龄阈值,返回年龄区间上下界、声明方式与分享状态
  • 返回结果新增 activeParentalControls 字段(家长控制项)

平台兼容性

uni-app(4.84)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS iOS插件版本 鸿蒙
- - - - - - × 13 1.0.1 -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x(4.84)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

hl-age-range-uts

Apple Declared Age Range(声明年龄范围) UTS 插件。

简单说:调用 iOS 系统弹窗,让用户(或家长)决定是否把「年龄范围」分享给你的 App,你拿到的不是精确生日,而是类似「13~14 岁」「16 岁及以上」这样的区间,用来做适龄功能开关。

注意:仅 iOS 26.0+,且需 Xcode 26+ 编译。Android / HarmonyOS 无此系统能力。


一、你需要准备什么

按顺序做,缺一步都可能签名失败或运行时报错。

步骤 做什么 谁负责
1 真机系统 ≥ iOS 26.0(建议 26.2+)
2 打包环境使用 Xcode 26+ / 含 iOS 26 SDK 的基座 你 / 云打包环境
3 插件已自带 UTS.entitlements(本插件已配好,一般不用改) 插件
4 Apple 后台 App ID 勾选 Declared Age Range,并重新下载描述文件
5 用新描述文件做自定义基座 / 正式包
6 页面里 import 后调用 requestAgeRange

本仓库已带 demo 页:pages/age-range-demo/index,配好能力后可直接真机验证。


二、能力配置(最关键,一步步来)

这项能力不是在证书里配,而是在 App ID + 描述文件 上开通。

2.1 插件侧(已配好,了解即可)

文件位置:

uni_modules/hl-age-range-uts/utssdk/app-ios/UTS.entitlements

内容:

<key>com.apple.developer.declared-age-range</key>
<true/>

2.3 配完怎么确认?

  • 描述文件重新生成时间是新的
  • 打包用的 Bundle ID = 已勾选能力的那个 App ID
  • 安装到 iOS 26+ 真机后,点 demo「获取年龄范围」能弹出系统界面(而不是马上返回 -10 / -11

三、平台支持

平台 支持 说明
iOS 支持 iOS 26.0+
Android 不支持 无对应系统 API
HarmonyOS 不支持 无对应系统 API

四、API 说明

requestAgeRange(ageGates, callback)

向系统请求用户的声明年龄范围。系统会弹出说明界面,由用户或监护人选择是否分享。

参数 类型 说明
ageGates number[] 年龄阈值,最多用前 3 个。例:[16][13, 15, 18]
callback (result) => void 结果回调

ageGates 是什么意思?

你告诉系统「你关心哪些年龄分界线」。例如传 [13, 15, 18],系统会据此划分年龄段;返回结果里用 lowerBound / upperBound 告诉你用户落在哪一段。

  • lowerBound == null:低于你设的最低阈值(例如「不到 13」)
  • upperBound == null:达到或超过最高阈值(例如「18 及以上」)

返回字段 AgeRangeResult

字段 类型 小白理解
code number 0 = 调用成功(注意:成功 ≠ 用户一定分享了)
shared boolean true = 用户同意分享;false = 拒绝分享
lowerBound number \| null 年龄下界;null 表示没有下界
upperBound number \| null 年龄上界;null 表示没有上界
declaration string selfDeclared 本人声明 / guardianDeclared 监护人声明 / confirmed 系统确认(iOS 26.5+) / "" 未分享
activeParentalControls string[] 家长控制项(未成年时可能有),见下表
message string 成功或失败的文字说明

activeParentalControls 可能的值

含义
communicationLimits 通讯功能受限(聊天/通话等应做限制)
significantAppChangeApprovalRequired 重大更新需家长审批

错误码

code 含义 常见原因
0 接口调用成功 再看 shared 判断有没有拿到年龄
-1 系统请求失败 异常信息看 message
-2 拿不到当前页面控制器 极少见,页面未就绪时调用可能触发
-3 未知响应类型 系统新枚举未覆盖
-10 编译环境没有 DeclaredAgeRange 没用 Xcode 26+ / SDK 不够新
-11 系统版本太低 真机 < iOS 26.0

五、使用示例

<template>
  <view class="container">
    <button @click="getAgeRange">获取年龄范围</button>
    <text v-if="resultText">{{ resultText }}</text>
  </view>
</template>

<script setup>
import { ref } from 'vue'
import { requestAgeRange } from '@/uni_modules/hl-age-range-uts'

const resultText = ref('')

const getAgeRange = () => {
  // 关心 16 岁这条分界线;也可写成 [13, 15, 18]
  requestAgeRange([16], (result) => {
    if (result.code != 0) {
      resultText.value = `错误(${result.code}):${result.message}`
      return
    }
    if (!result.shared) {
      resultText.value = '用户拒绝分享年龄范围'
      return
    }

    // 例:判断是否达到 16 岁及以上
    if (result.lowerBound != null && result.lowerBound >= 16) {
      resultText.value = '用户可能是 16+'
    } else {
      resultText.value = `年龄范围:${result.lowerBound ?? '-'} ~ ${result.upperBound ?? '+'},声明方式:${result.declaration}`
    }

    // 可选:处理家长控制
    if (result.activeParentalControls.indexOf('communicationLimits') >= 0) {
      // 限制聊天 / 通讯类功能
    }
  })
}
</script>

六、常见问题(FAQ)

Q1:证书里要勾什么吗?
不需要。证书只管签名身份。要勾的是 App ID 上的 Declared Age Range,然后重新生成描述文件。

Q2:返回 code = 0 但没有年龄?
sharedshared = false 表示用户拒绝分享,这是正常业务结果,不是崩溃。

Q3:一直返回 -10 / -11

  • -10:打包用的 Xcode / SDK 太旧
  • -11:真机系统不是 iOS 26+

Q5:怎么测试?
建议 iOS 26.2+ 真机 + Sandbox Apple 账号。普通账号/旧系统可能弹不出完整流程。


隐私、权限声明

1. 本插件需要申请的系统权限列表:

通过 UTS.entitlements 声明 Declared Age Range 能力

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据,年龄范围由系统 API 返回

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。