Facebook登录完成后如何立即执行代码并关闭当前页面?
解决Facebook登录后关闭页面及Delegate无响应问题
一、先修复LoginButtonDelegate方法无响应的问题
你实现了LoginButtonDelegate但方法没触发,核心原因是未给FBLoginButton设置代理。修正步骤如下:
- 确保你的视图控制器已遵循
LoginButtonDelegate协议(可通过类声明或extension实现) - 在创建
FBLoginButton的代码中添加代理绑定:
override func viewDidLoad() { super.viewDidLoad() let loginButton = FBLoginButton() loginButton.center = view.center loginButton.delegate = self // 必须添加这一行! view.addSubview(loginButton) }
完成后,登录流程触发时loginButton(_:didCompleteWith:error:)方法就会正常回调。
二、登录成功后关闭当前页面的实现
方式1:基于官方FBLoginButton+Delegate处理
在Delegate回调方法中,判断登录成功后调用dismiss,同时同步Facebook凭证到Firebase:
func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) { guard let token = result?.token?.tokenString, error == nil else { print("Facebook登录失败: \(error?.localizedDescription ?? "未知错误")") return } // 将Facebook凭证同步到Firebase认证 let credential = FacebookAuthProvider.credential(withAccessToken: token) Auth.auth().signIn(with: credential) { authResult, error in if let error = error { print("Firebase同步失败: \(error.localizedDescription)") return } // 登录成功,关闭当前页面 self.dismiss(animated: true) { // 可通过通知/闭包回调主页面切换按钮状态 NotificationCenter.default.post(name: NSNotification.Name("UserLoggedIn"), object: nil) } } }
方式2:自定义登录按钮(更灵活)
如果想完全控制登录流程,可不用官方按钮,自己创建UIButton并通过LoginManager手动发起登录:
- 创建自定义按钮:
override func viewDidLoad() { super.viewDidLoad() let customLoginButton = UIButton(type: .system) customLoginButton.setTitle("用Facebook登录", for: .normal) customLoginButton.center = view.center customLoginButton.addTarget(self, action: #selector(facebookLoginTapped), for: .touchUpInside) view.addSubview(customLoginButton) }
- 实现登录触发逻辑:
@objc func facebookLoginTapped() { let loginManager = LoginManager() loginManager.logIn(permissions: ["public_profile", "email"], from: self) { result, error in guard let token = result?.token?.tokenString, error == nil else { print("Facebook登录失败: \(error?.localizedDescription ?? "未知错误")") return } // 同步到Firebase let credential = FacebookAuthProvider.credential(withAccessToken: token) Auth.auth().signIn(with: credential) { authResult, error in if let error = error { print("Firebase同步失败: \(error.localizedDescription)") return } // 登录成功关闭页面 self.dismiss(animated: true) } } }
三、关于Delegate方法的必要性
loginButton(_:didCompleteWith:error:):非强制实现,但如果你需要处理登录结果(成功/失败回调)、同步第三方认证(比如Firebase)或执行自定义逻辑(关闭页面),就必须实现它。官方按钮的登录状态切换(登录→注销)是自动的,但自定义逻辑依赖这个回调。loginButtonDidLogOut(_:):同样非强制,仅当你需要处理用户主动注销后的逻辑(比如通知主页面切换回登录按钮)时才需要实现。
内容的提问来源于stack exchange,提问作者Alex Aghajanov
相关产品推荐
相关产品推荐

