更新记录

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

接入前准备

  1. 登录 Apple Developer,进入 Certificates, Identifiers & Profiles
  2. 选择当前应用的 App ID,启用 Sign in with Apple
  3. 重新生成并下载 Provisioning Profile。
  4. 在 HBuilderX 中使用新的描述文件制作自定义基座或正式包。
  5. 使用真机测试,标准基座无法完成 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

  1. Apple Developer 后台必须存在 App ID com.example.app
  2. 该 App ID 的 Sign in with Apple capability 必须已启用。
  3. 启用后必须重新生成并下载匹配 com.example.app 的 Provisioning Profile。
  4. HBuilderX 云打包、自定义基座或正式包必须选择新的描述文件,不能继续使用旧描述文件或标准调试基座。
  5. 重新安装新包后再测试,旧包的签名 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()。登录成功后,页面会展示 userstate、授权范围、authorizationCodeLengthidentityTokenLengthemailrealUserStatusfullName 等信息。出于安全考虑,Demo 控制台只打印 identityTokenauthorizationCode 的长度,不直接打印完整凭证。

API

getZAppleLogin()

返回 Apple 登录实例。

signIn(options)

参数 类型 必填 说明
state string 业务侧随机状态值,建议提交服务端校验
success function 登录成功回调
fail function 登录失败回调
complete function 完成回调

返回字段

字段 说明
user Apple 用户唯一标识
state 请求时传入的 state
authorizedScopes 用户授权的作用域
authorizationCode 授权码,建议发给服务端校验
identityToken JWT 身份令牌,建议发给服务端校验
email 用户邮箱,首次授权时可能返回
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 授权后重新登录。
  • identityTokenauthorizationCode 应提交服务端校验,客户端不要直接信任登录结果。
  • 服务端校验 identityToken 时应检查签名、过期时间、issuer、aud 和 nonce/state 等业务约束。
  • Android 如需 Apple 登录,应使用网页 OAuth 与服务端回调方案,不属于此 iOS 原生插件能力。

隐私、权限声明

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

无系统权限申请;iOS 需要在 Apple Developer 为当前 Bundle ID 启用 Sign in with Apple capability,并使用匹配的 Provisioning Profile 打包。

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

插件本身不采集、不存储、不上传用户数据,仅把系统 Sign in with Apple 授权结果返回给宿主应用。宿主应用如将 identityToken、authorizationCode、user、email 等字段提交到业务服务器,应在自身隐私政策中说明。

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

暂无用户评论。