目录

Xcode + Supabase:Apple 登录全流程集成指南

Xcode + Supabase:Apple 登录全流程集成指南

在移动应用开发中,提供 Apple 登录不仅是提升用户体验的关键,也是通过 App Store 审核的硬性要求(如果应用包含第三方登录)。本文将带你一步步完成从 Apple 开发者后台到 Supabase 的完整配置闭环。


一、 项目基础:添加 Supabase SDK

在 Xcode 中使用 Swift Package Manager (SPM) 是最现代化的集成方案。

  1. 添加依赖:在 Xcode 中依次点击 File > Add Packages...
  2. 仓库地址:粘贴 https://github.com/supabase/supabase-swift
  3. 版本选择:建议选择 Up to Next Major Version 以获取持续的安全性更新。
  4. 选择组件:勾选 Supabase 核心库。

二、 核心凭据:Apple Developer 后台配置

你需要在此处生成 Supabase 验证身份所需的四项关键参数:Team IDBundle IDKey IDPrivate Key

1. 确认项目标识 (App ID)

前往 Apple Developer Identifiers 列表

  • Bundle ID:确认你的项目标识符(例如:net.shipsaas.shipsaas-swift)。
  • Team ID:记录页面右上角或 App ID Prefix 处的 10 位字符(如:F7P5G9SB49)。
  • 功能开启:确保该 ID 已勾选 Sign In with Apple

2. 创建服务标识 (Services ID)

这是 Supabase 与 Apple 之间通讯的桥梁。

  • 操作:在 Identifiers 页面点击 +,选择 Services IDs
  • Identifier:建议设为 BundleID.auth(例如:net.shipsaas.shipsaas-swift.auth)。这在 Supabase 中被称为 Client ID

3. 生成私钥 (Private Key)

前往 Apple Developer Keys 列表

  • 创建:点击 +,勾选 Sign in with Apple
  • 配置:点击 Configure 选择你的 App ID,最后点击 Register
  • 保存:下载 .p8 文件并用文本编辑器打开,这就是你的 Secret Key。同时记录页面上的 Key ID

三、 云端对接:Supabase 控制台配置

前往 Supabase DashboardAuthentication > Providers > Apple 页面。

字段名称对应 Apple 后台参数常见错误提醒
Client IDServices ID (非 Bundle ID)填错会导致 Secret key should be a JWT 报错
Team ID10 位 Team ID确保与开发者账号一致
Key ID10 位 Key ID随 .p8 文件生成的 ID
Secret Key.p8 文件的完整文本内容必须包含 BEGINEND 连字符行

四、 关键一步:配置回调地址 (Callback URL)

这是完成授权闭环的最后一块拼图。

  1. 获取地址:在 Supabase 的 Apple Provider 页面底部,复制 Callback URL (for OAuth)
  2. 填回 Apple:回到 Apple Developer > Services IDs > 点击你创建的 ID > Sign In with Apple (Configure)
  3. 域名设置
    • Domains:填写 你的项目ID.supabase.co(不带 https)。
    • Return URLs:粘贴刚才从 Supabase 复制的完整地址,按回车键确认
  4. 保存退出:依次点击 Done、Continue、Save。

五、 代码实现:Xcode 开发与闭环

1. 开启项目能力

在 Xcode 的 Targets > Signing & Capabilities 中,点击 + Capability,添加 Sign in with Apple

2. 逻辑调用

在很多场景下,我们希望点击登录按钮后能直接调用系统弹窗并自动同步用户状态到 Supabase。以下是实现核心逻辑的代码示例:

import Supabase
import AuthenticationServices

// 初始化客户端(建议放在全局单例或依赖注入容器中)
let client = SupabaseClient(supabaseURL: URL(string: "YOUR_URL")!, supabaseKey: "YOUR_ANON_KEY")

func handleSignIn() async {
    do {
        // 调用 Supabase 封装好的 Apple 登录方法
        // 此方法会自动调起原生 Apple 登录弹窗,并在成功后处理 Token 交换
        try await client.auth.signInWithApple()
        print("登录成功!当前用户已更新。")
    } catch {
        print("登录失败: \(error.localizedDescription)")
    }
}

注意signInWithApple() 是 Supabase Swift SDK 提供的便捷方法,它内部封装了 ASAuthorizationController 的调用流程及与 Supabase Auth 的交互,极大地简化了开发者的工作量。


六、 闭环流程总结

  1. App 端发起:用户点击登录,系统通过 Bundle ID 调起 FaceID/TouchID。
  2. Apple 响应:验证成功后返回凭证(Identity Token)给 App。
  3. Supabase 验证:App 将凭证传给 Supabase,Supabase 使用 Services ID.p8 密钥 向 Apple 服务器二次确认。
  4. 回调闭环:验证通过后,Apple 通过 Return URL 确认安全策略,Supabase 最终为用户签发 JWT 并创建账户。