Xcode集成Sign In with Apple及Facebook Sign In SDK后FB按钮消失问题求助
问题根因分析
- 类定义重复且语法结构错误:你直接拼接了两个独立项目的ViewController代码,重复声明了
ViewController类,同时存在大量括号不匹配、扩展未正确闭合的语法问题,导致Facebook登录相关的代码逻辑没有被正确执行。 - Facebook按钮显示逻辑缺陷:当前代码仅在本地无有效Facebook AccessToken的分支下才会创建并添加登录按钮,若你之前调试Facebook登录时缓存过有效Token,会直接走if分支,按钮根本不会被创建。
- 布局适配问题:Facebook按钮写死了y坐标为550,在小屏设备上可能超出可视区域,或是被其他视图遮挡,导致肉眼不可见。
修复步骤
1. 合并ViewController类,修正语法错误
将两套登录逻辑整合到同一个ViewController类中,修正括号不匹配等语法问题,参考整合后的代码结构:
import AuthenticationServices import UIKit import FacebookLogin class ViewController: UIViewController, ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding, LoginButtonDelegate { private let signInButton = ASAuthorizationAppleIDButton() // 将FB按钮改成全局属性,避免局部变量提前释放 private let fbLoginButton = FBLoginButton() override func viewDidLoad() { super.viewDidLoad() // 添加苹果登录按钮 view.addSubview(signInButton) signInButton.addTarget(self, action: #selector(didTapSignIn), for: .touchUpInside) // 添加Facebook登录按钮 fbLoginButton.delegate = self fbLoginButton.permissions = ["public_profile", "email"] view.addSubview(fbLoginButton) // 原有Token判断逻辑可以保留,用来做自动跳转,不要用来控制按钮显隐 if let token = AccessToken.current, !token.isExpired { // 已登录的处理逻辑,比如直接跳转到首页 print("已登录Facebook,Token:\(token.tokenString)") } } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 苹果登录按钮布局 signInButton.frame = CGRect(x: 50, y: view.center.y - 80, width: 250, height: 50) // Facebook登录按钮布局,放在苹果按钮下方 fbLoginButton.frame = CGRect(x: 50, y: view.center.y + 30, width: 250, height: 50) } // 苹果登录原有逻辑 @objc func didTapSignIn() { let provider = ASAuthorizationAppleIDProvider() let request = provider.createRequest() request.requestedScopes = [.fullName, .email] let controller = ASAuthorizationController(authorizationRequests: [request]) controller.delegate = self controller.presentationContextProvider = self controller.performRequests() } func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { print("苹果登录失败:\(error)") } func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { switch authorization.credential{ case let credentials as ASAuthorizationAppleIDCredential: let firstname = credentials.fullName?.givenName let lastname = credentials.fullName?.familyName let email = credentials.email print("苹果登录成功:\(firstname ?? ""), \(lastname ?? ""), \(email ?? "")") break default: break } } func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { return view.window! } // Facebook登录原有逻辑 func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) { if let error = error { print("Facebook登录失败:\(error)") return } guard let result = result, !result.isCancelled else { print("用户取消了Facebook登录") return } // 登录成功处理逻辑 } func loginButtonDidLogOut(_ loginButton: FBLoginButton) { // 登出处理逻辑 } }
2. 验证按钮显示
如果修复后按钮仍不可见,使用Xcode自带的视图调试工具:运行项目后点击Debug栏的「Debug View Hierarchy」按钮,可直观查看当前视图的层级结构和每个控件的坐标,确认按钮是未被添加、出界还是被其他视图遮挡。
内容的提问来源于stack exchange,提问作者StzckOverFlowing
相关产品推荐
相关产品推荐

