我如何实现 Facebook 登录?

问题描述

我正在尝试使用新的 Facebook SDK 在 IOS 上实现 facebook 登录。我被卡住了,因为我使用的是我自己的自定义 Facebook 登录按钮,而 SDK 要求您使用它自己的登录按钮。有人可以帮忙吗?我需要实现某人单击自定义登录按钮并在授予权限后使用 facebook 进行身份验证的部分。谢谢!

我查看了文档,它只支持 Objective C 而不是 swift

这是我在 SDK 更新不再有效之前所拥有的

  let loginManager = LoginManager()
    loginManager.logIn(permissions: [ ".publicProfile,.email" ],viewController: self) { loginResult in
        switch loginResult {
        case .Failed:
            
            self.showMessage("Error logging you in.","Could not log you in. Please try again.",.error)
        case .cancelled:
            self.showMessage("User canceled login.","User cancelled login. Please try again.",.error)
        case .success:
            self.setFBUserData()
        }
    }

解决方法

你可以做这个技巧。最初创建一个 facebookLoginButton 但这将被隐藏。

let facebookLoginButton = FBLoginButton(frame: .zero,permissions: [.publicProfile,.email])
facebookLoginButton.delegate = self
facebookLoginButton.isHidden = true

并且在您的自定义按钮操作中,您只需要处理该操作

@IBAction func registerWithFacebook(_ sender: UIButton) {
    facebookLoginButton.sendActions(for: .touchUpInside)
}

希望你能理解。

关于这个技巧你可以查看更多:https://medium.com/@emmavagradyan/handle-facebook-login-with-custom-button-in-ios-3f1c99faeb55

关于 FacebookLogin 的配置:https://itnext.io/swift-facebook-ios-login-sdk-dada412d8341

,

对于自定义设计,我是这样做的。首先为自定义按钮创建一个自定义视图,并将点击手势添加到该视图。

创建您的观点的出口

@IBOutlet weak var fbLoginContainerView: UIView!

然后向该视图添加点击手势

let fbContainerTapGesture = UITapGestureRecognizer(target: self,action: #selector(fbLoginVIewAction(_:)))
fbLoginContainerView.addGestureRecognizer(fbContainerTapGesture)

正在使用 getFBUserData

 @objc func fbLoginVIewAction(_ sender: UITapGestureRecognizer) {
        
        let loginManager = LoginManager()
        loginManager.logIn(permissions: ["public_profile","email"],viewController: self) { loginResult in
            switch loginResult {
            case .failed(let error):
                print(error)
            case .cancelled:
                print("User cancelled login.")
            case .success(let grantedPermissions,let declinedPermissions,let accessToken):
                self.getFBUserData()
            }
        }
        
    }



fileprivate func getFBUserData(){
        if((AccessToken.current) != nil){
            GraphRequest(graphPath: "me",parameters: ["fields": "id,name,picture.type(large),email"]).start(completionHandler: { (connection,result,error) -> Void in
                if (error == nil){
                    self.dict = result as? [String : AnyObject]
                    print(result!)
                    print(self.dict)
                    self.showProgress(on: self.view)

                    guard let Username = self.dict["name"]! as? String else { return }
                    guard let UserId = self.dict["id"]! as? String else { return }
                    guard let Useremail = self.dict["email"]! as? String else { return }
                    let params = ["provider_user_id": UserId,"name": Username,"email": Useremail,"provider": "FacebookProvider"] as! [String: AnyObject]
                    //Do your sign in network call here with parameter
                   
        }
    }

查看按钮截图 enter image description here