Frontegg_SwiftUI_SDK

欢迎使用 @frontegg/ios Swift SDK!此 SDK 提供了一种无缝的方式,将 Frontegg 的身份验证和用户管理功能集成到您的 iOS 应用程序中。

目录

项目要求

支持的语言

Swift: 现在支持的最低 Swift 版本为 5.3。

支持的平台

支持主要平台版本,从

快速入门

准备 Frontegg 工作区

导航到 Frontegg Portal Settings,如果您没有应用程序,请在注册后按照集成步骤操作。从 Frontegg Portal Domain 复制 FronteggDomain 以供后续步骤使用

设置托管登录

将 frontegg 包添加到项目

创建 Frontegg plist 文件

要设置您的 SwiftUI 应用程序以与 Frontegg 通信,您必须在您的根项目目录下创建一个名为 Frontegg.plist 的新文件,此文件将存储供 Frontegg SDK 使用的变量的值

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
<plist version="1.0">
    <dict>
        <key>baseUrl</key>
        <string>https://[DOMAIN_HOST_FROM_PREVIOUS_STEP]</string>
        <key>clientId</key>
        <string>[CLIENT_ID_FROM_PREVIOUS_STEP]</string>
    </dict>
</plist>

SwiftUI 集成

UIKit 集成

嵌入式 Webview 与 ASWebAuthenticationSession

Frontegg SDK 支持两种身份验证方法

默认情况下,Frontegg SDK 将使用嵌入式 Webview,要使用 ASWebAuthenticationSession,您必须在 Frontegg.plist 文件中将 embeddedMode 设置为 NO

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
<plist version="1.0">
    <dict>
        <key>baseUrl</key>
        <string>https://[DOMAIN_HOST_FROM_PREVIOUS_STEP]</string>
        <key>clientId</key>
        <string>[CLIENT_ID_FROM_PREVIOUS_STEP]</string>

        <!-- START -->
        <key>embeddedMode</key>
        <true/>
        <!-- END -->
    </dict>
</plist>

配置 iOS 关联域名

配置您的 iOS 关联域名是 Magic Link 身份验证/重置密码/激活帐户所必需的。

为了将您的 iOS 关联域名添加到您的 Frontegg 应用程序,您需要在每个集成的 Frontegg 环境中更新您希望与该环境一起使用的 iOS 关联域名。向 https://api.frontegg.com/vendors/resources/associated-domains/v1/ios 发送一个 POST 请求,并附带以下有效负载

{
    “appId”:[YOUR_ASSOCIATED_DOMAIN]
}

为了使用我们的 API,请按照本指南生成供应商令牌。

接下来,您需要将您的关联域名添加到您的 iOS 应用程序。为此,请按照以下步骤操作

  1. 在 Xcode 中打开您的项目。
  2. 在项目导航器中选择您的项目。
  3. 选择您的目标。
  4. 选择 Signing & Capabilities 选项卡。
  5. 展开 Associated Domains 部分。
  6. 单击 + 按钮。
  7. applinks:[YOUR_ASSOCIATED_DOMAIN] 格式输入您的关联域名。
  8. webcredentials:[YOUR_ASSOCIATED_DOMAIN] 格式输入您的关联域名。
  9. 单击 Done。

[YOUR_ASSOCIATED_DOMAIN] 是您希望与您的 iOS 应用程序一起使用的关联域名。例如,如果您想使用 https://example.com 作为您的关联域名,您将输入 applinks:example.comwebcredentials:example.com

多应用支持

本指南概述了配置您的 iOS 应用程序以支持多个应用程序的步骤。

步骤 1:修改 Frontegg.plist 文件

applicationId 添加到 Frontegg.plist 文件

<plist version="1.0">
  <dict>
    <key>applicationId</key>  
    <string>your-application-id-uuid</string>
    <key>baseUrl</key>
    <string>https://your-domain.fronteg.com</string>
    <key>clientId</key>
    <string>your-client-id-uuid</string>
  </dict>
</plist>

多区域支持

本指南概述了配置您的 iOS 应用程序以支持多个区域的步骤。

步骤 1:修改 Frontegg.plist 文件

首先,调整您的 Frontegg.plist 文件以处理多个区域

修改:

Frontegg.plist 示例结构

<key>regions</key>
<array>
<dict>
    <key>key</key>
    <string>us-region</string>
    <key>baseUrl</key>
    <string>https://us-region-api.frontegg.com</string>
    <key>clientId</key>
    <string>your-client-id-for-us-region</string>
</dict>
<!-- Add additional regions in a similar format -->
</array>

步骤 2:为每个区域添加关联域名

对于每个区域,在应用程序的设置中配置关联的域。 这对于正确的 API 路由和身份验证至关重要。

关联域名配置示例: demo-multi-region.entitlements

按照 配置 iOS 关联域名 将您的 iOS 关联域名添加到您的 Frontegg 应用程序。

步骤 3:实现区域选择 UI

最后一步是为用户实现一个 UI 以选择他们的区域。这可以用您认为合适的任何方式完成。示例应用程序使用一个简单的选择器视图,允许用户选择他们的区域。

重要注意事项

选择欧盟区域 选择美国区域
eu-region-example.gif us-region-example.gif

区域选择 UI 示例

import SwiftUI
import FronteggSwift

struct SelectRegionView: View {
    @EnvironmentObject var fronteggAuth: FronteggAuth
    
    var body: some View {
        VStack(alignment: .leading) {
            Text("Welcome to MyApp")
                .font(.largeTitle)
            
            Text("Select your region:")
                .padding(.top, 8)
                .padding(.bottom, 20)
                .font(.title2)
            
            
            ForEach(fronteggAuth.regionData, id: \.key.self) { item in
                Button(action: {
                    FronteggApp.shared.initWithRegion(regionKey: item.key)
                }) {
                    VStack(alignment: .leading) {
                        Text("Region - \(item.key.uppercased())")
                            .font(.title2)
                            .padding(.bottom, 1)
                        Text("\(item.baseUrl)")
                            .font(.caption)
                            .tint(.black)
                            .padding(.bottom, 8)
                    }
                }
                .frame(maxWidth: .infinity, alignment: .leading)
                .contentShape(Rectangle())
            }
            
            Spacer()
            
        }
        .padding()
        .navigationTitle("Region")
    }
}

在应用程序卸载后注销用户

如果您希望用户在重新安装应用程序后不保持登录状态,请将 keepUserLoggedInAfterReinstall 属性添加到 Frontegg.plist 文件中

<plist version="1.0">
  <dict>
    <key>keepUserLoggedInAfterReinstall</key>
    <false/>
    ...
  </dict>
</plist>

默认情况下,keepUserLoggedInAfterReinstalltrue

使用 ASWebAuthenticationSession 登录

从 1.2.9 版本开始,Frontegg SDK 引入了对 ASWebAuthenticationSession 的支持,从而增强了登录体验。这一新功能允许更简化和安全的身份验证过程。

添加了一个 loginWithPopup 方法,其中包含用于适应 ASWebAuthenticationSession 集成的参数

以下示例演示了如何在 UIKit 和 SwiftUI 应用程序中将 ASWebAuthenticationSession 与 Frontegg SDK 一起使用。

UIKit 实现

对于使用 UIKit 的开发人员,可以按如下方式启动登录过程

import UIKit
import FronteggSwift

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func loginButtonTapped() {
        FronteggAuth.shared.loginWithPopup(window: self.view.window) { result in
            switch result {
            case .success(let user):
                print("User logged in: \(user)")
            case .failure(let error):
                print("Error logging in: \(error)")
            }
        }
    }
}

SwiftUI 实现

对于那些喜欢 SwiftUI 的人来说,集成同样简单

import SwiftUI
import FronteggSwift

struct ContentView: View {
    @EnvironmentObject var fronteggAuth: FronteggAuth
    
    var body: some View {
        VStack {
            if fronteggAuth.isAuthenticated {
                Text("User Authenticated")
            } else {
                Button("Login") {
                    fronteggAuth.loginWithPopup()
                }
            }
        }
    }
}

Passkeys 身份验证

Passkeys 提供无缝的无密码身份验证体验,利用平台级别的生物识别身份验证和 WebAuthn。按照以下步骤将 passkeys 功能集成到您的 iOS 应用程序中。

先决条件

  1. iOS 版本:确保您的项目面向 iOS 15 或更高版本,以支持必要的 WebAuthn API。
  2. 关联域名:配置您应用的关联域名以启用 passkeys 功能。
  3. Frontegg SDK 版本:使用 Frontegg iOS SDK 版本 1.2.24 或更高版本

配置关联域名

Passkeys 要求在您的应用中正确配置关联域名。请按照以下步骤操作

  1. 设置关联域名功能:

    • 在 Xcode 中打开您的项目。
    • 转到 Signing & Capabilities 选项卡。
    • + Capability 部分下添加 Associated Domains
    • 以以下格式输入您的应用的域名
      webcredentials:[YOUR_DOMAIN]
      
      示例
      webcredentials:example.com
      
  2. 托管 WebAuthn 配置文件:

    • .well-known/webauthn JSON 文件添加到您的域名服务器,结构如下
      {
        "origins": [
          "https://example.com",
          "https://subdomain.example.com"
        ]
      }
    • 确保可以在 https://example.com/.well-known/webauthn 公开访问此文件。
  3. 测试关联域名:


注册 Passkeys

Frontegg SDK 提供了一种在您的应用程序中注册 passkeys 的简单方法。

Passkeys 注册示例代码

import FronteggSwift

func registerPasskeys() {
    if #available(iOS 15.0, *) {
        FronteggAuth.shared.registerPasskeys()
    } else {
        print("Passkeys are only supported on iOS 15 or later.")
    }
}

使用 Passkeys 登录

要使用 passkeys 对用户进行身份验证,请使用 SDK 提供的以下方法

Passkeys 登录示例代码

import FronteggSwift

func loginWithPasskeys() {
    if #available(iOS 15.0, *) {
        FronteggAuth.shared.loginWithPasskeys { result in
            switch result {
            case .success(let user):
                print("User logged in: \(user)")
            case .failure(let error):
                print("Error logging in: \(error)")
            }
        }
    } else {
        print("Passkeys are only supported on iOS 15 or later.")
    }
}

FronteggAuth 方法

概述

FronteggAuth 接口为使用 Frontegg 的 iOS 应用程序提供身份验证功能。它包括用于用户身份验证、令牌管理、租户切换等方法。

安装

确保已将 Frontegg SDK 添加到您的 Swift 项目。有关安装步骤,请参阅官方文档。

属性

身份验证状态

配置

方法

用户身份验证

login(_ _completion: FronteggAuth.CompletionHandler? = nil, loginHint: String? = nil)

启动登录流程,显示 Frontegg 登录框。

logout(_ completion: @escaping (Result<Bool, FronteggError>) -> Void)

注销用户,清除认证数据。

租户管理

switchTenant(tenantId:String, _ completion: FronteggAuth.CompletionHandler? = nil)

切换当前用户的租户。

令牌管理

refreshTokenIfNeeded(attempts: Int = 0) -> Bool

如果需要,刷新身份验证令牌。

Passkeys 身份验证

loginWithPasskeys(_ _completion: FronteggAuth.CompletionHandler? = nil)

使用通行密钥登录。

registerPasskeys(_ completion: FronteggAuth.ConditionCompletionHandler? = nil)

注册通行密钥以进行身份验证。

授权请求

suspend fun requestAuthorizeAsync(refreshToken: String, deviceTokenCookie: String? = nil)-> User

异步请求静默授权。

fun requestAuthorize(refreshToken: String, deviceTokenCookie: String? = nil, _ completion: @escaping FronteggAuth.CompletionHandler)

使用回调请求授权。