如何在 SwiftUI 上登录 Facebook?

Zor*_*gan 13 facebook ios facebook-login swift swiftui

使用 SwiftUI 解释 Facebook 登录的资源并不多。我不确定我的代码是否需要 a ViewController,因为 FacebookLoginManager.login()包含一个ViewController参数 - 但这并没有真正转化为 SwiftUI。

无论如何,当用户单击Button以下内容时,我试图将用户登录到 Facebook :

登录视图.swift

import Foundation
import SwiftUI
import FBSDKLoginKit

struct LoginView: View {
    @EnvironmentObject var auth: UserAuth
    var body: some View {
        ZStack {
            VStack {
                Image("launcher_logo").resizable()
                .scaledToFit()
                .frame(height: 100)
                    .padding(.top, 100)
                Spacer()
                Button(action: {
                    FBLogin()
                }) {
                    Text("Continue with Facebook")
                }.foregroundColor(Color.black)
Run Code Online (Sandbox Code Playgroud)

Button点击 时,它FBLogin在下面初始化-login()在它的中触发init()

模型:

class FBLogin: LoginManager {

    let loginButton = FBLoginButton()
    let token = AccessToken.current
    let permissions = ["user_birthday", "user_gender", "public_profile"]

    override init(){
        super.init()
        logIn(permissions: permissions, from: nil)
        print("fb init()")
    }

    override func logIn(permissions: [String], from fromViewController: UIViewController?, handler: LoginManagerLoginResultBlock? = nil) {
        // TODO
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定从那里开始做什么。目前,只fb init()打印但我想执行登录并收听登录结果。

任何的想法?

小智 19

只需LoginManager在里面创建实例ObservableObject,然后自定义登录完成。你可以很容易地在里面使用SwiftUI View。没有必要UIViewControllerRepresentable。这是我的样本。

struct ContentView: View {
    @ObservedObject var fbmanager = UserLoginManager()
    var body: some View {
        Button(action: {
            self.fbmanager.facebookLogin()
        }) {
            Text("Continue with Facebook")
        }
    }
}

class UserLoginManager: ObservableObject {
    let loginManager = LoginManager()
    func facebookLogin() {
        loginManager.logIn(permissions: [.publicProfile, .email], viewController: nil) { loginResult in
            switch loginResult {
            case .failed(let error):
                print(error)
            case .cancelled:
                print("User cancelled login.")
            case .success(let grantedPermissions, let declinedPermissions, let accessToken):
                print("Logged in! \(grantedPermissions) \(declinedPermissions) \(accessToken)")
                GraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name"]).start(completionHandler: { (connection, result, error) -> Void in
                    if (error == nil){
                        let fbDetails = result as! NSDictionary
                        print(fbDetails)
                    }
                })
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)