更新记录
1.0.4(2026-05-12)
- 插件显示名称调整为 Apple 苹果授权登录,提升 Apple 相关搜索命中。
- 关键词补充 Apple授权登录,并保留苹果登录、苹果授权登录等中文关键词。
1.0.3(2026-05-12)
- 移除 iOS Apple 原始错误日志中的运行包 Bundle ID 诊断,避免在插件用户日志中暴露宿主应用包名。
- 文档中的具体 Bundle ID 示例改为通用占位示例。
1.0.2(2026-05-12)
- 修复 iOS 授权成功后可能因 UTS bridge 转换嵌套可选数据导致闪退的问题。
- iOS 原生成功回调改为只传递基础类型,姓名字段在 UTS 层组装。
平台兼容性
uni-app(4.76)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | × | √ | 13 | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.76)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | 13 | × | × |
zhuanz-apple-login
iOS 原生 Sign in with Apple 授权登录 UTS 插件,适用于 uni-app 和 uni-app x 的 App iOS 端。
功能
| 能力 | iOS | Android | H5/小程序 |
|---|---|---|---|
| Apple 授权登录 | 支持,iOS 13+ | 不支持 | 不支持 |
| identityToken 返回 | 支持 | 不支持 | 不支持 |
| authorizationCode 返回 | 支持 | 不支持 | 不支持 |
| 邮箱和姓名 | 首次授权时可能返回 | 不支持 | 不支持 |
兼容性版本
| 项目 | 最低版本 |
|---|---|
| HBuilderX | 4.76 |
| uni-app | 4.76 |
| uni-app x | 4.76 |
| iOS | 13.0 |
接入前准备
- 登录 Apple Developer,进入
Certificates, Identifiers & Profiles。 - 选择当前应用的 App ID,启用
Sign in with Apple。 - 重新生成并下载 Provisioning Profile。
- 在 HBuilderX 中使用新的描述文件制作自定义基座或正式包。
- 使用真机测试,标准基座无法完成 Apple 原生授权登录能力验证。
必须使用自定义基座或正式包运行。标准调试基座不会使用你的 Bundle ID、证书和描述文件,无法验证苹果授权登录。
插件已内置 utssdk/app-ios/UTS.entitlements:
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
该配置需要自定义基座或正式包才会随原生工程生效,默认 uni-app x 调试基座不会使用你的 Bundle ID、证书和描述文件。
如果运行时报:
com.apple.AuthenticationServices.AuthorizationError error 1000
请按当前安装包的实际 Bundle ID 检查,例如 com.example.app:
- Apple Developer 后台必须存在 App ID
com.example.app。 - 该 App ID 的
Sign in with Applecapability 必须已启用。 - 启用后必须重新生成并下载匹配
com.example.app的 Provisioning Profile。 - HBuilderX 云打包、自定义基座或正式包必须选择新的描述文件,不能继续使用旧描述文件或标准调试基座。
- 重新安装新包后再测试,旧包的签名 entitlement 不会自动变化。
iOS 签名 entitlement 需要通过 Apple Developer 后台和描述文件确认;当前 HBuilderX 5.07 的 UTS Swift 编译环境不支持直接调用 SecTaskCopyValueForEntitlement 做运行时读取。
使用示例
import { getZAppleLogin } from '@/uni_modules/zhuanz-apple-login'
const apple = getZAppleLogin()
apple.signIn({
state: 'YOUR_RANDOM_STATE',
success: (res) => {
console.log(res.user)
console.log(res.identityToken)
console.log(res.authorizationCode)
},
fail: (err) => {
console.log(err.errCode, err.errMsg)
},
complete: null
})
建议仅在 iOS 端引入和调用:
// #ifdef APP-IOS
import { getZAppleLogin } from '@/uni_modules/zhuanz-apple-login'
// #endif
Demo 调用说明
示例工程入口位于 pages/index/index.uvue,核心调用流程如下:
import * as appleLogin from '@/uni_modules/zhuanz-apple-login'
let appleSDK : appleLogin.ZAppleLogin | null = null
onLoad((_options : OnLoadOptions) => {
appleSDK = appleLogin.getZAppleLogin()
})
function loginWithApple() : void {
const sdk = appleSDK ?? appleLogin.getZAppleLogin()
appleSDK = sdk
sdk.signIn({
state: 'zhuanz-apple-login-demo',
success: (result : appleLogin.ZAppleLoginSuccess) => {
console.log('[zhuanz-apple-login][demo] Apple login success')
console.log('[zhuanz-apple-login][demo] user:', result.user)
console.log('[zhuanz-apple-login][demo] authorizationCodeLength:', result.authorizationCode.length)
console.log('[zhuanz-apple-login][demo] identityTokenLength:', result.identityToken.length)
uni.showToast({
title: '登录成功',
icon: 'success'
})
},
fail: (error : appleLogin.ZAppleLoginFail) => {
if (error.errCode == 107) {
return
}
uni.showToast({
title: error.errMsg != null && error.errMsg != '' ? error.errMsg : 'Apple 登录失败',
icon: 'none'
})
},
complete: null
} as appleLogin.ZAppleLoginOptions)
}
Demo 页面点击“使用 Apple 登录”后会调用 loginWithApple()。登录成功后,页面会展示 user、state、授权范围、authorizationCodeLength、identityTokenLength、email、realUserStatus、fullName 等信息。出于安全考虑,Demo 控制台只打印 identityToken 和 authorizationCode 的长度,不直接打印完整凭证。
API
getZAppleLogin()
返回 Apple 登录实例。
signIn(options)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| state | string | 否 | 业务侧随机状态值,建议提交服务端校验 |
| success | function | 是 | 登录成功回调 |
| fail | function | 是 | 登录失败回调 |
| complete | function | 否 | 完成回调 |
返回字段
| 字段 | 说明 |
|---|---|
| user | Apple 用户唯一标识 |
| state | 请求时传入的 state |
| authorizedScopes | 用户授权的作用域 |
| authorizationCode | 授权码,建议发给服务端校验 |
| identityToken | JWT 身份令牌,建议发给服务端校验 |
| 用户邮箱,首次授权时可能返回 | |
| realUserStatus | 真实用户状态,0 不支持,1 无法确认,2 可信度高 |
| fullName | 用户姓名,首次授权时可能返回 |
错误码
| 错误码 | 说明 |
|---|---|
| 101 | 当前系统版本不支持,需要 iOS 13.0+ |
| 102 | 系统环境异常,无法发起登录 |
| 103 | 授权结果不是 Apple ID 凭据 |
| 104 | 授权结果为空 |
| 105 | 缺少 identityToken |
| 106 | 缺少 authorizationCode |
| 107 | 用户取消登录 |
| 108 | 当前 App 未带 Sign in with Apple entitlement |
| 901 | 当前平台不支持 |
| 999 | Apple 原始错误,详见 cause |
Apple 原始错误
当插件错误码为 999 时,可查看 cause.code 中的 Apple 原始错误码。
| Apple 错误码 | 说明 | 常见原因 |
|---|---|---|
| 1000 | 未知错误 | 常见于 Bundle ID、Sign in with Apple capability、Provisioning Profile 或当前运行基座不匹配 |
| 1001 | 用户取消 | 用户主动关闭授权流程 |
| 1002 | 无效请求 | 应用签名、配置或请求环境异常 |
| 1003 | 不支持的操作 | 设备、系统版本或当前环境不支持 |
| 1004 | 用户交互被阻止 | 授权弹窗无法正常展示 |
错误处理示例:
fail: (error) => {
if (error.errCode == 107) {
return
}
const cause = error.cause as any
const appleCode = cause != null && cause.code != null ? parseInt(cause.code.toString()) : 0
if (error.errCode == 999 && appleCode == 1001) {
return
}
uni.showToast({
title: error.errMsg || 'Apple 登录失败',
icon: 'none'
})
}
注意事项
- 若原始错误为
com.apple.AuthenticationServices.AuthorizationError error 1000,优先检查 Apple Developer 是否启用Sign in with Apple、描述文件是否重新生成、当前是否使用自定义基座或正式包运行。 - Apple 只在首次授权时返回邮箱和姓名,后续登录通常不会再次返回。
- 如需重新获取邮箱和姓名,需要用户在系统设置中取消该 App 的 Apple ID 授权后重新登录。
identityToken和authorizationCode应提交服务端校验,客户端不要直接信任登录结果。- 服务端校验
identityToken时应检查签名、过期时间、issuer、aud 和 nonce/state 等业务约束。 - Android 如需 Apple 登录,应使用网页 OAuth 与服务端回调方案,不属于此 iOS 原生插件能力。

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