You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:36:04