问题描述
我正在尝试使用新的 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
}
}