SnapAuth Swift SDK

这是 SnapAuth 的官方 Swift SDK。

SnapAuth 能让你迅速为原生 App 添加通行密钥支持!在保持优秀、流畅的用户体验的同时,添加强大的多因素身份验证,或者完全实现无密码登录。

SnapAuth 首页 | SnapAuth 文档 | 控制面板 | Github

GitHub Release Test GitHub License

Swift Versions Supported Platforms

Swift Package Index | SPI 文档

平台支持

此 SDK 支持所有主要的支持通行密钥和硬件验证器的 Apple 平台。

平台 通行密钥 硬件密钥 备注
iOS ✅ 15.0+ ✅ 15.0+
iPadOS ✅ 15.0+ ✅ 15.0+
macOS ✅ 12.0+ ✅ 12.0+
macOS (Catalyst) ⚠️ ⚠️ 仍在测试中(应该可以工作)
visionOS ✅ 1.0+ visionOS 不支持硬件密钥
tvOS ⚠️ 16.0+ 仍在测试中,tvOS 不支持硬件密钥

Apple Watch 不支持通行密钥或硬件密钥,因此本 SDK 不支持 watchOS。如果在未来的 watchOS 版本中添加了支持,我们也会进行相应适配!

快速上手

注册 SnapAuth

如果您尚未注册 SnapAuth,您需要先注册:https://www.snapauth.app/register

与 Web 集成不同,即使是 localhost 也仍然需要 https (Web 集成允许 https://)。根据您的开发设置,您可能需要立即添加测试或暂存服务器环境。

提示

如果您需要帮助,请随时给我们发送电子邮件!

设置关联域名

警告

这不是 SnapAuth 特有的,但必须完成,否则 API 会立即返回错误。

请参阅关联域名设置指南,配置您的 App 以支持通行密钥。

添加 SnapAuth SDK

XCode > 文件 > 添加 Package Dependencies...

在添加包对话框中,搜索我们的 SDK

https://github.com/snapauthapp/sdk-swift

选择一个 Dependency Rule 并将其添加到您的开发目标。我们推荐 "Dependency Rule: Up to Next Major Version"。

我们所有的 SDK 都遵循语义版本控制,因此这应该始终是一个安全的选择。

导入 SDK

在任何需要与 SnapAuth 集成的文件中,请务必导入它

import SnapAuth

调用 API

从 SnapAuth 控制面板获取您的 publishable key;您将在下面使用它。

这通常在按钮的 action 中完成。这是一个 SwiftUI 中非常简单的登录视图

import SnapAuth
import SwiftUI

struct SignInView: View {
  let snapAuth = SnapAuth(publishableKey: "pubkey_yourkey") // Set this value!

  @State var userName: String = ""

  var body: some View {
    VStack {
      TextField("Username", text: $userName)
      Button("Sign In", systemImage: "person.badge.key") {
        signIn()
      }
    }
  }

  func signIn() {
    Task {
      let result = await snapAuth.startAuth(.username(userName))
      switch result {
      case .success(let auth):
        // Send auth.token to your backend to sign in the user
      case .failure(let error):
        // Decide how to proceed
      }
    }
  }
}

自动填充辅助请求

注意

自动填充目前仅在 iOS/iPadOS >= 16 和 visionOS 上受支持。在其他平台或 OS 版本上,这将立即返回一个失败代码,表明缺少平台支持。

要使系统在用户名字段获得焦点时建议通行密钥,请进行以下添加以启动该过程并处理结果

  1. .textContentType(.username) 添加到用户名 TextField,如果尚未设置
TextField("Username", text: $userName)
  .textContentType(.username) // <-- Add this
  1. 在视图呈现时运行自动填充 API
// ...
var body: some View {
  VStack {
    // ...
  }
  .onAppear(perform: autofill) // <-- Add this
}

// And this
func autofill() {
  Task {
    let autofillResult = await snapAuth.handleAutofill()
    guard case .success(let auth) = autofillResult else {
      // Autofill failed, this is common and generally safe to ignore
      return
    }
    // Send auth.token to your backend to sign in the user, as above
  }
}

已知问题

在我们的测试中,tvOS 中的登录对话框没有打开,至少在模拟器中是这样。

即使使用 Apple 记录的配置,AutoFill API 也无法可靠地提供通行密钥建议。SwiftUI 和 UIKit 内部似乎存在显示问题,导致建议栏无法一致地呈现。我们已向 Apple 提交反馈,但这超出了我们的控制范围。

有用资源

许可证

BSD-3-Clause