自定义 Facebook 登录按钮 - 集成后

Posted

技术标签:

【中文标题】自定义 Facebook 登录按钮 - 集成后【英文标题】:Customized Facebook Login Button - After integration 【发布时间】:2016-04-03 00:45:45 【问题描述】:

在关注this guide 之后,我正在尝试自定义 Facebook 登录按钮。一切都正确集成,我可以登录 Facebook,然后顺利退出。

现在我的下一个目标是让屏幕看起来像我的模型,这包括将登录按钮正确放置在故事板上,但唯一的问题是它不会出现在故事​​板上,它只是出现在我运行模拟。我查看了其他溢出答案,但它们并没有真正有帮助,因为它们是针对早期版本的 swift / Xcode 的,并且没有按照 cmets 所说的那样工作。我的代码与指南完全相同,因为这是我尝试实现的第一个屏幕。

我们将不胜感激。

【问题讨论】:

如果您可以通过my mock up 提供您想要实现的目标,那就太好了 【参考方案1】:

如果您想使用 自定义 facebook SDK 按钮,您可以在情节提要中创建任何自定义按钮,并像这样在视图控制器中提供操作

在顶部导入

import FBSDKCoreKit
import FBSDKLoginKit

斯威夫特 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 中使用 UIView 并设置 Custom Class** 部分的 Class* 字段,我们必须设置 FBLoginValue

参考:默认SDK登录按钮教程:http://www.appcoda.com/ios-programming-facebook-login-sdk/

参考:用于参数和更多信息的自定义 SDK 登录按钮:https://developers.facebook.com/docs/facebook-login/ios

【讨论】:

所以我添加了这个,并尝试将它连接到一个按钮,但现在我得到了一系列未声明的类型“loginFacebookAction””错误。关于为什么会这样的任何想法? 所以当您尝试将 IBAction 连接到 UIButton 时会出现此错误? 也许我试图错误地添加按钮呢?我已经像你一样将它添加到故事板中,但是当我尝试将其放入我的 //MARK: Actions 时,通过控制将其拖到视图控制器中,就像迄今为止每个指南告诉我的那样,它会发出错误。我将它的类设置为 loginFacebokAction,但这也没有解决问题。 :(。这是我第一次用 swift 编码,所以我有点迷茫。 我知道我做错了什么。我试图创建另一个按钮,但它被嵌套在按钮内,所以我删除了您提供的 IBAction,创建了我自己的 IBAction,并将您的 IBAction 代码放入其中,现在它可以工作了。所以我只是愚蠢,并且错误地创建了它。现在完美运行,非常感谢。 如果用户“取消”登录,此方法将使应用程序崩溃。【参考方案2】:

POD 安装

source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
target “ProjectName” do
  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("??")
        
    


Info.plist

Info.plist-->右键->OpenAs-->源码-->添加..

<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>

【讨论】:

你好,我怎样才能观察到用户是否注册过?例如是新用户,我应该设置一些信息。如果用户不是新用户,我只需要去另一个视图控制器 请您再解释一下您的问题吗?【参考方案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)")
                                
                            
                        )
                    
                
            
        
    
 

【讨论】:

此代码适用于 Facebook 登录并获取此代码的用户电子邮件、访问令牌、ID、名称 太好了,你救了我【参考方案4】:

欢迎来到 ***,Shika!该教程向您展示了如何添加 Facebook 作为其 SDK 的一部分提供的按钮。本教程告诉您将按钮置于设备屏幕的中心。如果您愿意,Facebook 允许您创建自己的按钮。在我看来,我更喜欢它,因为您可以在故事板中使用它,这与在 Swift 中以编程方式创建的按钮不同。您可以使用 Facebook 文档 here 并向下滚动到“自定义登录按钮”。你的代码会改变,但不会改变太多!如果您选择走这条路线,请确保删除您复制和粘贴的代码以添加位于 viewDidLoad 中的按钮。另外,您可以删除您在 Swift 文件顶部添加的 FBSDKLoginButtonDelegate。

【讨论】:

唯一的问题是它在 obj-c 中:(。但是非常感谢你提供这个资源,我想我会尝试转换它。

以上是关于自定义 Facebook 登录按钮 - 集成后的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义按钮登录 Facebook

自定义移动 Facebook 登录按钮?

使用 FB 登录构建了一个自定义 html 页面。我想在使用 facebook 登录按钮后将它们重定向到主页

自定义 Google Plus 登录按钮和 Facebook 登录按钮

Facebook SDK iOS 的自定义分享、登录按钮

使用自定义登录按钮检索Facebook页面