首页 > 解决方案 > SwiftUI Facebook 登录:如何让 Facebook id 回到视图中?

问题描述

我正在使用如何在 SwiftUI 上登录 Facebook 中的以下代码?在我的应用中使用 Facebook 登录。效果很好,除了我找不到将 id 和访问令牌取回我的视图的方法,我需要在其中更新变量。

我的代码:

登录视图.swift

import SwiftUI
// Facebook Login
import FBSDKLoginKit
import FacebookLogin

[...]

// Facebook Login
let facebookLoginButton = FBLoginButton(frame: .zero, permissions: [.publicProfile])

struct LoginView: View {
    
    @EnvironmentObject var viewRouter: ViewRouter
    
    // Facebook Login
    @ObservedObject var fbmanager = UserLoginManager()

    var body: some View {

        [...]
        Button(action: {
            self.fbmanager.facebookLogin()
        }) {
            FacebookButtonContent(buttonWidth: 120, buttonHeight: 60, buttonRadius: 15)
        }
        [...]
    }
}

[...]

// Facebook Login
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)
                        let fbUserId = fbDetails["id"] ?? ""
                        let fbAccessToken = AccessToken.current?.tokenString ?? ""
                    }
                })

                // 
                // QUESTION: how to get the fbUserId and fbAccessToken here ???
                // 
            }
        }
    }
}

这就是我卡住的地方:我想在 GraphRequest 调用之后获取 fbUserId 和 fbAccessToken ,以便我的函数 facebookLogin 可以返回它们。我怎样才能做到这一点?

感谢您的帮助!

标签: swiftxcodefacebookfacebook-login

解决方案


我找到了如何做到这一点,在这里发布解决方案:

我修改了函数facebookLogin如下:

facebookLogin(_ completion: @escaping (String) -> ())

完整的UserLoginManager类代码:

// Facebook Login
class UserLoginManager: ObservableObject {
    
    let loginManager = LoginManager()
    
    func facebookLogin(_ completion: @escaping (String) -> ()) {
        loginManager.logIn(permissions: [.publicProfile, .email], viewController: nil) { loginResult in
            switch loginResult {
            case .failed(let error):
                print(error)
                completion("")
            case .cancelled:
                print("User cancelled login.")
                completion("")
            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)
                        let fbUserId = fbDetails["id"] ?? ""
                        let fbAccessToken = AccessToken.current?.tokenString ?? ""

                        let fbResult = "id=\(fbUserId)&accessToken=\(fbAccessToken)"
                        completion(fbResult)
                    }
                    else
                    {
                        completion("")
                    }
                })
            }
        }
    }
}

然后在我的按钮中,我执行了以下操作:

Button(action: {
            self.fbmanager.facebookLogin { (completionData) in
            // Do operation with String
            print(completionData);
        }
}) {
   FacebookButtonContent(buttonWidth: 120, buttonHeight: 60, buttonRadius: 15)
}

希望这可以帮助其他有同样问题的人......


推荐阅读