定制化的Facebook登录按钮 - 集成后

17
我正在按照这篇指南的步骤自定义Facebook登录按钮。一切都整合正确,我可以登录和注销没问题。 现在我的下一个目标是让屏幕看起来像我的模型,这包括在Storyboard上正确放置登录按钮,但唯一的问题是它不会出现在Storyboard上,只会在运行模拟器时显示。我查看了其他stackoverflow的答案,但它们并没有真正有用,因为它们是针对早期版本的Swift/Xcode,而且从评论中看来并不奏效。我的代码与指南完全相同,因为这是我要实现的第一个屏幕。 非常感谢您的帮助。

如果您能提供“我的模拟”来说明您想要实现什么,那将是很好的。 - HardikDG
4个回答

61
如果您想使用自定义Facebook SDK按钮,可以在storyboard中创建任何自定义按钮,并在viewcontroller中提供操作,如下所示。
顶部导入
import FBSDKCoreKit
import FBSDKLoginKit

Swift 3:

  @IBAction func loginFacebookAction(sender: AnyObject) {//action of the custom button in the storyboard
    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
    fbLoginManager.logIn(withReadPermissions: ["email"], from: self) { (result, error) -> Void in
      if (error == nil){
        let fbloginresult : FBSDKLoginManagerLoginResult = result!
        // if user cancel the login 
        if (result?.isCancelled)!{
                return
        }
        if(fbloginresult.grantedPermissions.contains("email"))
        {
          self.getFBUserData()
        }
      }
    }
  }

  func getFBUserData(){
    if((FBSDKAccessToken.current()) != nil){
      FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
        if (error == nil){
          //everything works print the user data
          print(result)
        }
      })
    }
  }

早期版本的Swift:

 @IBAction func loginFacebookAction(sender: AnyObject) {//action of the custom button in the storyboard
        let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
        fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self) { (result, error) -> Void in
            if (error == nil){
                let fbloginresult : FBSDKLoginManagerLoginResult = result
                if(fbloginresult.grantedPermissions.contains("email"))
                {
                    self.getFBUserData()
                }
            }
        }
    }

    func getFBUserData(){
        if((FBSDKAccessToken.currentAccessToken()) != nil){
            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).startWithCompletionHandler({ (connection, result, error) -> Void in
                if (error == nil){
                    //everything works print the user data
                    print(result)
                }
            })
        }
    }
如果您想要使用默认的Facebook登录按钮,可以在身份检查器(Identity Inspector)中设置“自定义类别(Custom Class)”部分的Class*字段,并将其设置为FBLoginValue。 参考资料: 默认SDK登录按钮教程:http://www.appcoda.com/ios-programming-facebook-login-sdk/ 参考资料: 自定义SDK登录按钮的参数和更多信息:https://developers.facebook.com/docs/facebook-login/ios

我添加了这个,试图将其连接到一个按钮,但现在我得到了一个“未声明类型'loginFacebookAction'”的错误。你有什么想法为什么会出现这种情况? - Jordan Benge
当您尝试将IBAction连接到UIButton时,是否出现此错误? - HardikDG
也许我添加按钮的方式不正确?我已经像你一样将它添加到故事板中,但是当我尝试将其拖入视图控制器的//MARK: Actions中时,就像每个指南告诉我的那样,它会出现错误。我将其类设置为loginFacebokAction,但这也没有解决问题。:(这是我第一次使用Swift编码,所以我有点迷失。 - Jordan Benge
1
我找出了我的错误。我试图创建另一个按钮,但它被嵌套在按钮内部,所以我删除了你提供的IBAction,创建了自己的IBAction,并将你的IBAction代码放入其中,现在它可以正常工作了。所以我只是太蠢了,创建它时犯了错误。现在它完美地工作了,非常感谢你。 - Jordan Benge
1
如果用户“取消”登录,此方法将使应用程序崩溃。 - Saqib Omer
简洁明了的回答。 - Numan Karaaslan

13

安装 POD

source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
target “ProjectNamedo
  pod 'FacebookCore'
  pod 'FacebookLogin'
  pod 'FacebookShare'
end

AppDelegate.swift

import FacebookLogin
import FBSDKLoginKit
import FacebookCore

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    return true
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}

ViewController.swift

import UIKit
import FacebookLogin
import FBSDKLoginKit
import FacebookCore

class ViewController: UIViewController {

override func viewDidLoad() {
    if(FBSDKAccessToken.current() == nil){
        print("Not logged in ")
    }else{
        print("Logged in already")
        getFacebookUserInfo()
    }
}

@IBAction func CustomButton_Click(_ sender: Any) {
    getFacebookUserInfo()
}

func getFacebookUserInfo(){
    let loginManager = LoginManager()
    loginManager.logIn([.publicProfile, .email ], viewController: self) { (result) in
        switch result{
        case .cancelled:
            print("Cancel button click")
        case .success:
            let params = ["fields" : "id, name, first_name, last_name, picture.type(large), email "]
            let graphRequest = FBSDKGraphRequest.init(graphPath: "/me", parameters: params)
            let Connection = FBSDKGraphRequestConnection()
            Connection.add(graphRequest) { (Connection, result, error) in
                let info = result as! [String : AnyObject]
                print(info["name"] as! String)
            }
            Connection.start()
        default:
            print("??")
        }
    }
}
}

信息属性列表

信息属性列表 --> 右键单击 -> 打开方式 -> 源代码 -> 添加 < dict > .. < /dict >

<key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>YOUR APP ID</string>
            </array>
        </dict>
    </array>
    <key>FacebookAppID</key>
    <string>YOUR APP ID</string>
    <key>FacebookDisplayName</key>
    <string>YOUR APP NAME</string>

1
你好,我该如何观察用户是否已经注册了呢?例如,如果用户是新注册的,我需要设置一些信息。如果用户不是新用户,我只需进入另一个视图控制器即可。 - Zhandos.Nurakhmetov
请问您能否详细说明一下您的问题? - Abhimanyu Rathore

3

@IBAction func buttonLogin(_ sender: Any) {

    let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()

    fbLoginManager.logIn(withReadPermissions: ["public_profile","email"], from: self) { (result, error) in

        if (error == nil){
            let fbloginresult : FBSDKLoginManagerLoginResult = result!
            if fbloginresult.grantedPermissions != nil {
                if(fbloginresult.grantedPermissions.contains("email")) {
                    if((FBSDKAccessToken.current()) != nil){
                        FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
                            if (error == nil){
                               let dict: NSDictionary = result as! NSDictionary
                                if let token = FBSDKAccessToken.current().tokenString {
                                    print("tocken: \(token)")

                                    let userDefult = UserDefaults.standard
                                    userDefult.setValue(token, forKey: "access_tocken")
                                    userDefult.synchronize()
                                }
                                if let user : NSString = dict.object(forKey:"name") as! NSString? {
                                    print("user: \(user)")
                                }
                                if let id : NSString = dict.object(forKey:"id") as? NSString {
                                    print("id: \(id)")
                                }
                                if let email : NSString = (result! as AnyObject).value(forKey: "email") as? NSString {
                                    print("email: \(email)")
                                }
                            }
                        })
                    }
                }
            }
        }
    }
 }

1
这段代码适用于Facebook登录并获取用户电子邮件、访问令牌、ID和名称。 - Srinivasan.M
太好了,你救了我。 - Nishant Pathania

0
欢迎来到StackOverflow,Shika!该教程向您展示如何添加Facebook提供的按钮作为其SDK的一部分。该教程告诉您如何将按钮居中于设备屏幕的中心位置。如果您愿意,Facebook允许您创建自己的按钮。在我看来,我更喜欢这种方式,因为您可以在Storyboard中进行操作,而不像在Swift中以编程方式创建按钮。您可以使用Facebook文档此处并滚动到“自定义登录按钮”。您的代码将会有所改变,但不会太多!如果您选择这条路,请确保删除您复制并粘贴到viewDidLoad中添加按钮的代码。此外,您还可以删除您在Swift文件顶部添加的FBSDKLoginButtonDelegate。

唯一的问题是它是用 obj-c 写的 :(. 但非常感谢您提供这个资源,我想我会尝试转换它。 - Jordan Benge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接