Swift & Facebook 登录:我的 UIViewController 不符合 FBSDKLoginButtonDelegate
Posted
技术标签:
【中文标题】Swift & Facebook 登录:我的 UIViewController 不符合 FBSDKLoginButtonDelegate【英文标题】:Swift & Facebook login : my UIViewController does not conform to FBSDKLoginButtonDelegate 【发布时间】:2015-05-18 22:35:05 【问题描述】:即使 Facebook 教程说不需要标头,我在通过 .swift 文件中的简单导入框架添加 FBSDK 功能时也遇到了问题。
所以,我遵循了这个教程: http://www.brianjcoleman.com/tutorial-how-to-use-login-in-facebook-sdk-4-0-for-swift/ 使用 swift 6.3 SDK Facebook 4.1 SDK
但我有两个问题
FBLoginViewViewController does not conform to FBSDKLoginButtonDelegate
Cannot assign a value of type 'FBLoginViewViewController' to a value
of type 'FBSDKLoginButtonDelegate!'
所以我无法登录,我尝试删除 import 语句,没有任何变化,我还实现了 appDelegate 中的每个语句,一切应该没问题,但仍然......
提前致谢
//
// FBLoginViewViewController.swift
// SocialFBLogin
//
// Created by XXXX XXXX on 18/05/15.
// Copyright (c) 2015 XXXX XXXX. All rights reserved.
//
import UIKit
import FBSDKCoreKit
import FBSDKShareKit
import FBSDKLoginKit
//@objc(FBLoginViewViewController)
class FBLoginViewViewController: UIViewController, FBSDKLoginButtonDelegate
@IBOutlet weak var FBLoginPicture: UIImageView!
@IBOutlet weak var FBLoginNameLabel: UILabel!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
if (FBSDKAccessToken.currentAccessToken() != nil)
// User is already logged in, do work such as go to next view controller.
else
let loginView : FBSDKLoginButton = FBSDKLoginButton()
self.view.addSubview(loginView)
loginView.center = self.view.center
loginView.readPermissions = ["public_profile", "email", "user_friends"]
loginView.delegate = self
// Facebook Delegate Methods
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!)
println("User Logged In")
if ((error) != nil)
// Process error
else if result.isCancelled
// Handle cancellations
else
// If you ask for multiple permissions at once, you
// should check if specific permissions missing
if result.grantedPermissions.contains("email")
// Do work
func loginButtonDidLogOut(loginButton: FBSDKLoginButton!)
println("User Logged Out")
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
【问题讨论】:
教程真的很不错。我刚刚尝试使用 Facebook ios SDK 4.2.0,但无法重现。我建议更新,确保您已将 FBSDKCoreKit 和 FBSDKLoginKit 添加到您的桥接头,然后重试。 如果您按照教程中的所有说明进行操作,则不需要任何导入。您应该在桥接头文件中包含所有导入。您的委托方法也正确编写。我只是在一个工作项目中替换了它们,我没有收到任何错误。正如@corvuszero 建议的那样,尝试使用最新的 SDK。委托方法可能与您使用的版本不同,并且可能与示例不匹配。如果您出于任何原因仍想使用较旧的 SDK,请不要复制/粘贴委托方法,请使用自动完成或检查 FB 标头以了解确切的声明。 【参考方案1】:先生,我刚刚解决了这个问题!你必须让你的 viewController 符合 FBSDKLoginButtonDelegate。首先,您将它添加到您的协议中,如下所示:
class MainView: UIViewController, UITableViewDataSource, UITableViewDelegate, FBSDKLoginButtonDelegate
//Your Code
要符合此协议,您必须实现以下两种方法:
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!)
println("User Logged In")
if ((error) != nil)
// Process error
else if result.isCancelled
// Handle cancellations
else
// If you ask for multiple permissions at once, you
// should check if specific permissions missing
if result.grantedPermissions.contains("email")
// Do work
func loginButtonDidLogOut(loginButton: FBSDKLoginButton!)
println("User Logged Out")
你只要复制这段代码就可以了!
更新到 Swift 3
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!)
print("User Logged In")
if ((error) != nil)
// Process error
else if result.isCancelled
// Handle cancellations
else
// If you ask for multiple permissions at once, you
// should check if specific permissions missing
if result.grantedPermissions.contains("public_profile")
// Do work
func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!)
print("User Logged Out")
【讨论】:
完美运行!实现部分很重要! 你是个天才。你刚刚让过去的 3 小时变得有价值。【参考方案2】:只要实现这些方法就可以了
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!)
if (error == nil)
else
println(error.localizedDescription)
func loginButtonDidLogOut(loginButton: FBSDKLoginButton!)
println("User logged out...")
override func viewDidLoad()
super.viewDidLoad()
if (FBSDKAccessToken.currentAccessToken() != nil)
println("User logged in...")
else
println("User not logged in...")
let fbLoginButton: FBSDKLoginButton! = FBSDKLoginButton()
self.view.addSubview(fbLoginButton)
fbLoginButton.delegate = self
fbLoginButton.center = self.view.center
fbLoginButton.readPermissions = ["public_profile", "email", "user_friends"]
【讨论】:
【参考方案3】:将“func loginButton(...”和“func loginButtonDidLogOut(...”移出“override func viewDidLoad() ... ”。
【讨论】:
试着给你一些解释。【参考方案4】:我发现方法和委托的名称已更改
如果对某人有用,这是我的代码
import UIKit
import FacebookCore
import FacebookLogin
class LoginViewController: UIViewController, LoginButtonDelegate
override func viewDidLoad()
super.viewDidLoad()
let loginButton = LoginButton(readPermissions: [ .publicProfile ])
loginButton.center = view.center
loginButton.delegate = self
view.addSubview(loginButton)
// MARK: - LoginButtonDelegate
func loginButtonDidCompleteLogin(_ loginButton: LoginButton, result: LoginResult)
func loginButtonDidLogOut(_ loginButton: LoginButton)
【讨论】:
【参考方案5】:看来,对于最新的 Facebook SDK 4.x 版本、Xcode 9.0.1 和 Swift 4,您需要一个额外的功能才能使 LoginButtonDelegate 工作(如您所见,如果您单击 Delegate 协议然后使用 CTRL CMD J 跳转到它的定义):
func loginButtonWillLogin(_ loginButton: FBSDKLoginButton) -> Bool
return true
【讨论】:
以上是关于Swift & Facebook 登录:我的 UIViewController 不符合 FBSDKLoginButtonDelegate的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 立即解析 Facebook 登录默认为用户取消登录
迁移到 Swift 3 时,Facebook 登录不会返回应用程序