FronteggSwift 1.2.16

FronteggSwift 1.2.16

David Antoon维护。



  • Frontegg LTD

Frontegg_SwiftUI_SDK

Frontegg 是一个网络平台,SaaS 公司可以在其中设置他们完全托管、可扩展且具有品牌意识的 - SaaS 功能,并通过最多 5 行代码将它们整合到他们的 SaaS 门户中。

目录

项目要求

支持的语言

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

支持的平台

支持从以下版本开始的主要平台版本:

  • iOS > 14

开始使用

准备Frontegg工作区

导航到Frontegg 门户设置,如果没有应用,请根据注册后的集成步骤操作。将FronteggDomain复制到Frontegg 门户域的下一步中

设置托管登录

  • 导航到登录方法设置
  • 切换托管登录方法
  • 添加{{IOS_BUNDLE_IDENTIFIER}}://{{FRONTEGG_BASE_URL}}/ios/oauth/callback
  • IOS_BUNDLE_IDENTIFIER替换为您的应用程序标识符
  • FRONTEGG_BASE_URL替换为您的frontegg基本URL

将 frontegg 包添加到项目中

  • 打开你的项目
  • 选择 文件 -> 添加包
  • 在搜索字段中输入 https://github.com/frontegg/frontegg-ios-swift
  • 按下 添加包

建立 Frontegg plist 文件

为了配置你的 SwiftUI 应用程序以与 Frontegg 通信,你需要在你的根项目目录下创建一个名为 Frontegg.plist 的新文件,此文件将存储 Frontegg SDK 将使用到的值

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<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 集成

  • 添加 Frontegg 包装器

    • 要使用 Frontegg SDK,你必须使用 FronteggWrapper 包装你的应用程序场景

      import SwiftUI
      import FronteggSwift
      
      @main
      struct demoApp: App {
          var body: some Scene {
              WindowGroup {
                  FronteggWrapper {
                      MyApp()
                  }
              }
          }
      }
    • 修改 MyApp.swift 文件,根据用户是否已认证来渲染内容

      1. 在文件中添加 @EnvironmentObject var fronteggAuth: FronteggAuth
      2. 基于 fronteggAuth.isAuthenticated 渲染你的整个应用程序
      struct MyApp: View {
        @EnvironmentObject var fronteggAuth: FronteggAuth
        
        var body: some View {
          ZStack {
            if fronteggAuth.isAuthenticated {
              [YOU APPLICATION TABS / ROUTER / VIEWS]
            } else  {
              
              Button {
                  fronteggAuth.login()
              } label: {
                  Text("Login Button")
              }
            }
          }
        }
      }
    • 添加自定义加载屏幕

    使用自己的 LoadingView / SplashScreen

    • 在独立文件中构建您的加载视图
    • LoadingView 作为 AnyView 传递给 FronteggWrapper
      FronteggWrapper(loaderView: AnyView(LoaderView())) {
        MyApp()
      }

UIKit 集成

  • 添加 Frontegg UIKit 包装器

    • 将 Frontegg 添加到 AppDelegate 文件中

        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
      
            FronteggApp.shared.didFinishLaunchingWithOptions()
          
            return true
        }
    • 创建一个从 FronteggSwift 扩展 AbstractFronteggController 的 FronteggController 类

        //
        //  FronteggController.swift
        //
        
        import UIKit
        import FronteggSwift
        
        class FronteggController: AbstractFronteggController {
        
            override func navigateToAuthenticated(){
                // This function will be called when the user is authenticated
                // to navigate your application to the authenticated screen
                
                let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let viewController = mainStoryboard.instantiateViewController(withIdentifier: "authenticatedScreen")
                self.view.window?.rootViewController = viewController
                self.view.window?.makeKeyAndVisible()
            }
        
        }
    • 创建新的 ViewController 并将上一步骤中的 FronteggController 设置为自定义视图类ViewController custom class

    • 将 FronteggController 标记为 Storyboard Entry Point ViewController entry point

    • 为 Frontegg 配置 SceneDelegate 以使用通用链接

        func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
            if let url = URLContexts.first?.url,
                url.startAccessingSecurityScopedResource() {
                defer  {
                    url.stopAccessingSecurityScopedResource()
                }
                if url.absoluteString.hasPrefix( FronteggApp.shared.baseUrl ) {
                    if(FronteggApp.shared.auth.handleOpenUrl(url)){
                        // Display your own Authentication View Controller
                        // to handle after oauth callback
                        window?.rootViewController = AuthenticationController()
                        window?.makeKeyAndVisible()
                        return
                    }
                }
                
            }
        }
        func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
            if let url = userActivity.webpageURL {
                if(FronteggApp.shared.auth.handleOpenUrl(url)){
                    // Display your own Authentication View Controller
                    // to handle after oauth callback
                    window?.rootViewController = AuthenticationController()
                    window?.makeKeyAndVisible()
                    return
                }
            }
        }
    • 通过 FronteggApp.shared.auth 访问已验证的用户

          
        //
        //  ExampleViewController.swift
        //
        
        import UIKit
        import SwiftUI
        import FronteggSwift
        import Combine
        
        
        class ExampleViewController: UIViewController {
        
            // Label to display logged in user's email
            @IBOutlet weak var label: UILabel!
            var showLoader: Boolean = true
            
            override func viewDidLoad() {
                super.viewDidLoad()
                // Do any additional setup after loading the view.
                
                // subscribe to isAuthenticated and navigate to login page
                // if the user is not authenticated
      
                let fronteggAuth = FronteggApp.shared.auth
                let sub = AnySubscriber<Bool, Never>(
                    receiveSubscription: {query in
                        query.request(.unlimited)
                    }, receiveValue: { showLoader in
                       self.showLoader = showLoader
                       self.label.text = fronteggAuth.user?.email ?? "Unknown"
                       
                       if(!showLoader && !fronteggAuth.isAuthenticated){
                           // Display your own Authentication View Controller
                           // to handle after oauth callback
                           window?.rootViewController = AuthenticationController()
                           window?.makeKeyAndVisible()
                           return .none
                       }
                       return .unlimited
                    })
      
                FronteggApp.shared.auth.$showLoader.subscribe(sub)
                
            }
             
            @IBAction func logoutButton (){
                FronteggApp.shared.auth.logout()
            }
      
        }
        

配置 iOS 关联域名

配置您的 iOS 关联域名对于魔法链接身份验证/重置密码/激活账户是必需的。

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

{
    “appId”:[YOUR_ASSOCIATED_DOMAIN]
}

要使用我们的API,请按照以下指南生成供应商令牌。