更新记录
1.0.0(2026-11-02)
- 新增 iOS 原生 Sign in with Apple 授权、凭证状态查询、撤销通知订阅及精确释放。
- 新增 state 匹配、nonce 透传、并发保护、单次终态与取消/超时处理,区分本地等待和系统窗口生命周期。
- 新增 uni-app Vue2/Vue3 与 uni-app x 分类标签示例、脱敏诊断、完整报告和固定快照分段复制。
- 新增原生 entitlement、源码构建身份、双项目同步与分层验证脚本;本候选源码仍需 Apple 编译及 iPhone 业务验收。
- 修复 iOS 对非空原生错误码字符串强制解包导致的编译错误。
- 修复 iOS 诊断日期、日志长度、请求编号和可空原生状态的类型转换。
- 修复 iOS 回执解析对类型信封布尔解码的依赖,改用基础字段读取并校验请求、成功标志与错误码的一致性;新原生包仍需真机复验。
- 修复诊断脱敏对 credentialState、nativeState 等非敏感状态字段的误匹配。
平台兼容性
uni-app(5.33)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | - | - | × | - | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | - | × | × | × | - | - |
uni-app x(5.33)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | × | - | × | × |
lizhao-apple-login 苹果授权登录与凭证状态
介绍
为 uni-app(Vue2/Vue3)和 uni-app x 提供 iOS 原生 Sign in with Apple 授权、凭证状态与撤销通知的 UTS 插件。当前交付为候选源码,本轮 iOS 回执解析修正后仍需匹配新源码的 Apple 编译、签名与 iPhone 回归,平台声明中的 - 表示待验证。
功能特色
| 功能 | 能解决的问题 | API 或配置 |
|---|---|---|
| 原生苹果授权 | 获取用户标识、identityToken 和一次性授权码,按需请求邮箱/姓名 | signInWithApple |
| 凭证状态与撤销 | 查询已有用户的状态,接收撤销通知并释放自己的监听 | getAppleCredentialState、onAppleCredentialRevoked、offAppleCredentialRevoked |
| 取消与并发保护 | 区分用户取消、本地取消和超时,系统流程未结束时保留忙碌状态 | cancelAppleLogin、timeoutMs |
| 能力检测 | 查看系统 API、系统取消能力及真实原生忙碌状态;签名未核实则为 unknown | getAppleLoginCapabilitiesSync |
| 完整诊断 | 查看有界脱敏日志,复制完整报告或同一快照的分段,复制失败可手动选择 | getAppleLoginDiagnosticsSync、setAppleLoginDiagnosticsEnabled及双宿主示例 |
适合哪些场景
| 业务场景 | 推荐能力 | 使用边界 |
|---|---|---|
| 已有账号体系增加 iOS 苹果登录 | signInWithApple |
服务端验证签名、iss、aud、exp、nonce,并校验或兑换授权码后建立业务会话 |
| 启动或关键操作前检查已授权用户 | getAppleCredentialState |
由业务提供已安全保存的用户标识;查询失败不等于已撤销 |
| 授权变化后更新业务状态 | onAppleCredentialRevoked 与 offAppleCredentialRevoked |
系统通知不提供具体用户;页面卸载时释放自己的监听 |
| 用户离开授权页面或等待过久 | cancelAppleLogin 与 timeoutMs |
本地结束不代表系统窗口已关闭、Apple 授权撤销或账号退出 |
插件不负责账号数据库、会话签发、账户注销或部署后端。
下载与导入
| 宿主 | 示例代码位置 |
|---|---|
| uni-app(Vue2/Vue3) | uni_modules/lizhao-apple-login/example/uniapp/index.vue |
| uni-app x | uni_modules/lizhao-apple-login/example/uniappx/index.uvue |
从基础到进阶:按业务模块使用
接入准备
目前按源码导入,将完整 uni_modules/lizhao-apple-login/ 放入工程,不拆出内部文件。没有已发布市场链接。
从插件根导入:
import { signInWithApple, getAppleLoginCapabilitiesSync } from '@/uni_modules/lizhao-apple-login'
将对应示例去掉扩展名后注册到项目 pages.json。两种示例均保留真实插件调用、操作日志、完整报告和复制回退,页面语法与滚动容器按宿主分别维护。
接入前完成以下配置:
- 使用当前应用真实 Bundle ID,在 Apple Developer 后台为 App ID 启用 Sign in with Apple,更新匹配的描述文件。
- 保留
uni_modules/lizhao-apple-login/utssdk/app-ios/config.json和uni_modules/lizhao-apple-login/utssdk/app-ios/UTS.entitlements;构建时合并 Apple entitlement,不能代替后台配置。 - 使用匹配本次源码、Bundle ID、签名和描述文件的 iOS 自定义基座或正式包。标准基座不能验证客户应用的签名能力;WGT 不能更新已编译的原生插件。
- 原生目标 iOS 13+,实际运行下限还取宿主/编译器的更高要求。本轮资源验证使用 HBuilderX 5.34 工具链,其他版本需重新核对。
示例标签与测试范围
示例通过“授权登录”和“凭证与能力”标签分类:前者测试授权、资料选项和取消等待;后者测试能力检查、凭证查询、撤销监听与释放及诊断开关。页面底部始终保留日志、完整报告、分段及手动复制入口。凭证查询需要先取得真实 Apple 用户标识。
模块一:取得授权凭据
以下 JavaScript 可用于 uni-app 页面 methods 中。没有服务端挑战时可先测原生授权;生产接入应从后端取得并绑定一次性的 nonce/state,再传入 options。不要使用固定演示字符串充当生产随机挑战。
import { signInWithApple, getAppleLoginCapabilitiesSync } from '@/uni_modules/lizhao-apple-login'
export default {
data() { return { requestId: '', status: '待授权' } },
methods: {
login() {
const capability = getAppleLoginCapabilitiesSync()
if (!capability.supported) { this.status = capability.limitation; return }
this.requestId = signInWithApple({
scopes: ['email', 'fullName'],
timeoutMs: 120000,
success: (result) => {
this.status = 'Apple授权完成,请交服务端验证'
// 在业务HTTPS接口中提交result.identityToken、authorizationCode及本次挑战。
// 此处不打印、持久化或复制凭据;实际请求由业务自己的后端地址决定。
},
fail: (error) => { this.status = error.errCode + ':' + error.errMsg },
complete: () => { this.requestId = '' }
})
}
}
}
完整可操作页面见 uni_modules/lizhao-apple-login/example/uniapp/index.vue;它在内存保留 user 用于查询,不把凭据写入日志。
模块二:uni-app x 强类型调用
import { signInWithApple, AppleLoginOptions, AppleLoginSuccess, AppleLoginFail, AppleLoginComplete } from '@/uni_modules/lizhao-apple-login'
const options: AppleLoginOptions = {
scopes: [],
success: (result: AppleLoginSuccess): void => {
uni.showToast({ title: 'Apple授权完成,待服务端验证', icon: 'none' })
// 业务从此回调提交真实凭据;fullName/email为null时保留已有业务资料。
},
fail: (error: AppleLoginFail): void => {
uni.showToast({ title: error.errCode.toString() + ':' + error.errMsg, icon: 'none' })
},
complete: (result: AppleLoginComplete): void => {
// complete不含凭据,可按requestId结束对应页面忙碌态。
}
}
const requestId = signInWithApple(options)
在页面事件中执行上述代码;完整状态、输入、释放与报告示例见 uni_modules/lizhao-apple-login/example/uniappx/index.uvue。请始终从根导入类型和函数。
模块三:查询、撤销通知与页面释放
以下 JavaScript 接收真实成功结果保存的 user,不使用虚构用户标识发起查询:
import { getAppleCredentialState, onAppleCredentialRevoked, offAppleCredentialRevoked, cancelAppleLogin } from '@/uni_modules/lizhao-apple-login'
export default {
data() { return { appleUser: '', loginRequest: '', revokedSubscription: '', status: '' } },
methods: {
checkCredential() {
if (!this.appleUser) { this.status = '请先授权或加载业务保存的Apple用户标识'; return }
getAppleCredentialState({
user: this.appleUser,
success: (result) => { this.status = result.state },
fail: (error) => { this.status = error.errCode + ':' + error.errMsg }
})
},
observeRevocation() {
if (this.revokedSubscription) return
this.revokedSubscription = onAppleCredentialRevoked(() => { this.checkCredential() })
}
},
onUnload() {
if (this.loginRequest) cancelAppleLogin(this.loginRequest)
if (this.revokedSubscription) offAppleCredentialRevoked(this.revokedSubscription)
}
}
撤销通知不提供 user,插件将 event.user 返回 null;业务根据自己持有的标识查询,不能把通知伪装成指定用户已注销。transferred 需要服务端配合处理应用转移。状态查询 fail 与 revoked/notFound 不同,失败时不要删除账号。
API 用途速查
| API | 用途与返回 |
|---|---|
| getAppleLoginCapabilitiesSync() | 同步返回 AppleLoginCapabilities;API支持不代表当前签名或网络必然可授权 |
| signInWithApple(options) | 返回 requestId;success/fail互斥、complete最多一次;业务结果异步派发 |
| getAppleCredentialState(options) | 返回查询requestId;原生查询独立超时,不占用授权流程 |
| cancelAppleLogin(requestId) | 返回 AppleLoginCancelResult,只取消匹配的授权等待 |
| onAppleCredentialRevoked(listener) | 返回订阅ID;非iOS返回空串并记录不支持,不产生伪造事件 |
| offAppleCredentialRevoked(subscriptionId) | 释放本订阅;未知ID无副作用,不清其他页面监听 |
| getAppleLoginDiagnosticsSync() | 返回构建标记、时间、脱敏日志、丢弃计数和原生快照 |
| setAppleLoginDiagnosticsEnabled(enabled) | 控制详细阶段记录;关键错误继续保留,不改变业务回调 |
授权参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| scopes | string[] | 否 | 只请求业务所需资料,未知值失败 | [] | email、fullName |
| state | string | 否 | 不超过1024字符、非空;省略时原生安全随机生成并核对回传 | 原生生成 | 服务端一次性会话值 |
| nonce | string | 否 | 不超过1024字符、非空;原样传递,不隐式SHA-256;服务端验证绑定 | 不设置 | 服务端挑战或约定摘要 |
| timeoutMs | number | 否 | 整数毫秒 | 120000 | 10000–300000 |
| success | function | 否 | AppleLoginSuccess;不得直接打印整对象 | 不设置 | — |
| fail | function | 否 | AppleLoginFail;取消同样走fail | 不设置 | — |
| complete | function | 否 | AppleLoginComplete,不含凭据 | 不设置 | — |
查询、取消和监听参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| user | string | 查询必填 | 真实授权返回的用户标识,不超过1024字符 | 无 | — |
| timeoutMs | number | 查询选填 | 状态查询整数毫秒 | 15000 | 1000–60000 |
| success/fail/complete | function | 否 | 查询结果、错误与不含凭据的完成摘要 | 不设置 | — |
| requestId | string | 取消必填 | signInWithApple返回的ID;过期或其他请求不取消 | 无 | — |
| listener | function | 监听必填 | AppleCredentialRevokedEvent,可持续回调 | 无 | — |
| subscriptionId | string | 释放必填 | 本页面持有的监听ID | 无 | — |
| enabled | boolean | 诊断设置必填 | 是否记录详细阶段 | true | true、false |
结果与事件
- AppleLoginSuccess:errSubject、errCode=0、errMsg、requestId、user、identityToken、authorizationCode、state、authorizedScopes、email、fullName、realUserStatus。授权码与JWT必须交服务端;用户标识不是会话凭证。
- email、fullName 可能为 null。fullName 包含可空 givenName、familyName、middleName、namePrefix、nameSuffix、nickname。Apple不保证每次返回个人资料,不覆盖业务已保存资料。
- realUserStatus 为系统原值:0不支持、1未知、2较可能真实;不能单独作为业务鉴权或风控结论。
- AppleCredentialStateResult:requestId、user、state、nativeState,以及标准错误摘要。state 为 authorized、revoked、notFound、transferred 或 unknown,保留未来原生值。
- AppleLoginCancelResult:requestId、cancelled(本地等待是否结束)、systemCancelRequested(是否请求系统取消)、nativePending(系统终态仍未确认)、errMsg。systemCancelRequested不代表已关闭系统窗口。
- AppleCredentialRevokedEvent:eventId、occurredAt、user=null,来源为系统通知。订阅应在离开页面时释放,避免频繁重复注册。
- AppleLoginCapabilities:platform、supported、systemVersion、supportsSystemCancel、nativeBusy、entitlement、nativeBuildId、limitation。entitlement=unknown时需核对真实签名,不能靠本地配置文件推断。
- AppleLoginDiagnostics:pluginId、pluginVersion、buildId、generatedAt、entries、droppedEntries、nativeSnapshot。记录有界,容量覆盖有计数;不含业务凭据正文。
错误码说明
errSubject 固定为 lizhao-apple-login。AppleLoginFail 还保留 requestId、nativeDomain、nativeCode、nativeCause(已脱敏;不可采集时 unknown)。同一错误码在所有入口语义一致。
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 9361001 | 当前端或系统不支持 | 使用iOS原生宿主并确认系统下限;其他端没有网页降级 |
| 9361002 | 参数不合法 | 检查scope、字符长度与毫秒范围 |
| 9361003 | 旧授权仍在等待或原生未结束 | 等待真实系统终态,避免重复点击 |
| 9361004 | 没有可呈现窗口 | 在可见活动页面由用户操作触发 |
| 9361005 | 用户取消 | 按取消恢复页面,不当作业务账号注销 |
| 9361006 | 本地等待已取消 | 可能仍有系统窗口;不推断Apple授权已撤销 |
| 9361007 | 等待超时,结果未知 | 旧系统流程未结束可能继续busy;不要直接自动重试 |
| 9361008 | state不匹配 | 丢弃本次回执,检查挑战与请求关联 |
| 9361009 | credential或必要字段缺失 | 保留诊断;姓名/邮箱为空本身不属于此错误 |
| 9361010 | 凭证状态查询失败 | 检查原生错误,不能当作revoked/notFound |
| 9361011 | 原生调用失败 | 查看脱敏domain/code/cause与签名、窗口、账号环境 |
| 9361012 | 桥接返回或解析失败 | 确认页面资源与新原生基座源码一致,保留完整报告 |
Apple原生1000可能有多种原因,不能一律判定缺entitlement;先核Bundle ID、后台capability、描述文件、安装包签名及真实系统原因。用户取消与本地取消分别保留。
注意事项
平台与验收状态
目标能力仅 iOS 原生;兼容设计覆盖 uni-app Vue2/Vue3 与 uni-app x。Android、Harmony、Web 和所有小程序没有 Apple 登录实现,导入后返回明确不支持。其他平台的Google/华为账号不是苹果账号授权。
源码、静态检查、资源导出、Apple SwiftCompile/链接、匹配自定义基座与iPhone业务必须分别验证。当前候选源码的实际验证记录随开发更新;平台待验标记不代表已通过真机。
签名、服务端与生命周期
- 新增或修改原生Swift、UTS原生生成物、系统Framework或entitlement后需要重新iOS原生联编或制作自定义基座。资源/WGT不能补进原生代码。
- iOS16+才有ASAuthorizationController.cancel;iOS13–15本地取消后不能承诺关闭系统UI。旧控制器没有真实终态时继续保持busy。
- success/fail与complete按请求最多触发一次,客户回调异常隔离;异常正文可能含凭据,不自动采集。页面卸载时释放自己的请求及监听,并防止自己异步查询回调更新已卸载页面。
- 原生最多并行32个凭证查询,超出同样返回9361003;不自动创建无界查询。订阅按ID精确移除,避免反复重复注册。
- nonce原样传入;业务若约定SHA-256摘要,需要服务端与客户端明确一致。只在客户端解码JWT不等于验签。Client Secret、p8私钥和refresh token不得放客户端。
- 业务退出、系统账号退出、Apple授权撤销、服务端账户删除不同。Apple令牌撤销由服务端调用
/auth/revoke;插件不提供伪注销方法。 - 姓名/邮箱可能仅首次出现,业务应通过自己的安全管道保存;Apple隐藏邮件地址需按官方私有邮件转发要求配置发信域。
诊断与隐私
日志只在本地内存保留,默认不上传。原生在缓存前不写凭据,页面/helper在缓存和展示前脱敏;错误保留真实码和采集边界。不要在业务success中自行打印整结果。
两份完整示例底部均有一键复制日志、完整报告、固定快照分段与全文手动选择。报告包含插件/源码标记、运行时环境、调用与回调轨迹、错误和丢弃计数。HX/编译器构建信息、基座或运行时不可取得的字段明确写 unknown,不用排查电脑版本冒充客户包版本。生成完整报告后再逐段复制,后续日志不修改既有快照;失败不推进分段,不清原日志。
不请求定位、相机、通讯录、跟踪等无关权限,不使用第三方SDK。实际Apple授权通过系统服务联网;签名能力配置不是普通弹窗权限。客户自身后端的数据收集应在业务隐私政策说明。
官方接入依据:配置Sign in with Apple、服务端验证、撤销与账户删除。
作者系列 UTS 插件
以下链接以项目已核实的已发布清单为准;本候选插件不提前加入已上架列表。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-alipay-kit |
支付宝授权登录、App 支付与脱敏诊断 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-camera-pro |
原生相机、拍照录像、水印与媒体保存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 | 查看插件 |
lizhao-hce-card |
NFC 虚拟卡、APDU 交互与 NDEF 标签模拟 | 查看插件 |
lizhao-health |
健康数据授权、查询、统计与写入 | 查看插件 |
lizhao-http-server |
本地 HTTP 服务、文件传输与实时通信 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-id-photo |
证件照制作、尺寸换算、换底色与模板换装 | 查看插件 |
lizhao-img-eraser |
图片去水印、局部修复与原生编辑器 | 查看插件 |
lizhao-live-activity |
实时活动、系统胶囊与普通通知降级 | 查看插件 |
lizhao-live-photo |
实况照片选取、展示预览与原件处理 | 查看插件 |
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-notify-pro |
本地通知、点击动作、进度与定时提醒 | 查看插件 |
lizhao-novel-reader |
原生小说阅读、仿真翻页与段落评论 | 查看插件 |
lizhao-office-view |
Office 与 PDF 文件预览、进度与缓存管理 | 查看插件 |
lizhao-pdf-pro |
PDF 阅读、签批、真实写回与页面处理 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-serial-port |
路径串口、USB 串口、多会话收发与诊断 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 | 查看插件 |
lizhao-tcp-pro |
TCP 客户端、服务端、多连接与诊断 | 查看插件 |
lizhao-usb-storage |
U 盘、移动硬盘文件浏览、读写与批量复制 | 查看插件 |
lizhao-video-editor |
视频裁剪、压缩、取帧与 FFmpeg/FFprobe | 查看插件 |
lizhao-video-feed |
短视频上下滑、短剧选集与分页加载 | 查看插件 |
lizhao-video-player |
原生视频播放器、清晰度与播放交互 | 查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 | 查看插件 |
lizhao-vpn-pro |
企业 VPN、IKEv2、安全接入与脱敏诊断 | 查看插件 |
lizhao-wechat-kit |
微信登录、分享、支付、小程序与客服 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12735030
赞赏 1959
赞赏
京公网安备:11010802035340号