1. ホーム
  2. swift

[解決済み] SwiftUIのFacebookログイン。FacebookのIDをビューに戻すには?

2022-03-03 04:05:01

質問

私は、以下のコードを SwiftUIでFacebookにログインする方法は? 私のアプリでFacebookでログインするために。うまくいくのですが、変数を更新する必要があるビューに ID とアクセストークンを戻す方法が見つからないことがあります。

私のコード

LoginView.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がそれらを返すようにしたいのです。どうすればいいのでしょうか?

助けてくれてありがとうございます。

解決方法は?

この方法を見つけたので、ここに解決策を掲載します。

関数を修正しました。 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)
}

これが同じ問題を抱える誰かの助けになることを願って...。