更新记录
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 但没有年龄?
看 shared。shared = false 表示用户拒绝分享,这是正常业务结果,不是崩溃。
Q3:一直返回 -10 / -11?
-10:打包用的 Xcode / SDK 太旧-11:真机系统不是 iOS 26+
Q5:怎么测试?
建议 iOS 26.2+ 真机 + Sandbox Apple 账号。普通账号/旧系统可能弹不出完整流程。

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 276
赞赏 2
下载 12456726
赞赏 1935
赞赏
京公网安备:11010802035340号