更新记录

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。两种示例均保留真实插件调用、操作日志、完整报告和复制回退,页面语法与滚动容器按宿主分别维护。

接入前完成以下配置:

  1. 使用当前应用真实 Bundle ID,在 Apple Developer 后台为 App ID 启用 Sign in with Apple,更新匹配的描述文件。
  2. 保留 uni_modules/lizhao-apple-login/utssdk/app-ios/config.json 和 uni_modules/lizhao-apple-login/utssdk/app-ios/UTS.entitlements;构建时合并 Apple entitlement,不能代替后台配置。
  3. 使用匹配本次源码、Bundle ID、签名和描述文件的 iOS 自定义基座或正式包。标准基座不能验证客户应用的签名能力;WGT 不能更新已编译的原生插件。
  4. 原生目标 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 微信登录、分享、支付、小程序与客服 查看插件

隐私、权限声明

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

iOS应用签名需Sign in with Apple capability与匹配描述文件;无额外照片、位置、通讯录或跟踪权限。

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

用户主动授权时通过Apple系统服务取得授权凭据与按需个人资料,凭据交由调用者服务端验签;插件不持久化凭据、不上传业务服务器或诊断日志。

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

无

暂无用户评论。