facebook login with swift 3

13,972

Solution 1

Here is the code for login the Facebook by a UIButton click.

Step 1: Copy this code into your class file:

import UIKit
import FBSDKShareKit
import FBSDKLoginKit
import FBSDKCoreKit

class Facebook_loginPageViewController: UIViewController {

   override func viewDidLoad() {
       super.viewDidLoad()
   }

   override func didReceiveMemoryWarning(){
      super.didReceiveMemoryWarning()
   }


   @IBAction func login(_ sender: Any) {
      self.facebooklogin()
   }


   func facebooklogin() {
      let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
      fbLoginManager.logIn(withReadPermissions: ["email"], handler: { (result, error) -> Void in

      print("\n\n result: \(result)")
      print("\n\n Error: \(error)")

      if (error == nil) {
        let fbloginresult : FBSDKLoginManagerLoginResult = result!
        if(fbloginresult.isCancelled) {
           //Show Cancel alert
        } else if(fbloginresult.grantedPermissions.contains("email")) {
            self.returnUserData()
            //fbLoginManager.logOut()
        }
       }
     })
    }


    func returnUserData() {
       let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"])
       graphRequest.start(completionHandler: { (connection, result, error) -> Void in
          if ((error) != nil) {
              // Process error
              print("\n\n Error: \(error)")
           } else {
                 let resultDic = result as! NSDictionary
                 print("\n\n  fetched user: \(result)")
                 if (resultDic.value(forKey:"name") != nil) {
                     let userName = resultDic.value(forKey:"name")! as! String as NSString?
                     print("\n User Name is: \(userName)")
                  }

                 if (resultDic.value(forKey:"email") != nil) {
                     let userEmail = resultDic.value(forKey:"email")! as! String as NSString?
                     print("\n User Email is: \(userEmail)")
                  }
             }
        })
     }
}

Step 2: In AppDelegate add the id of Facebook:

import UIKit
import FBSDKShareKit
import FBSDKLoginKit
import FBSDKCoreKit

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        let str_URL = url.absoluteString as NSString
        if str_URL.contains("fb1111111111111111")// put you id here {
           return FBSDKApplicationDelegate.sharedInstance().application(
                    app,
                    open: url as URL!,
                    sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
                    annotation: options[UIApplicationOpenURLOptionsKey.annotation])
          }


           return FBSDKApplicationDelegate.sharedInstance().application(
                app,
                open: url as URL!,
                sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
                annotation: options[UIApplicationOpenURLOptionsKey.annotation])

        }
}

Updated Code :App Delegate

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        let str_URL = url.absoluteString as NSString
        if str_URL.contains("fb111111111111111"){
           return FBSDKApplicationDelegate.sharedInstance().application(
                    app,
                    open: url as URL?,
                    sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as! String,
                    annotation: options[UIApplication.OpenURLOptionsKey.annotation])
          }


           return FBSDKApplicationDelegate.sharedInstance().application(
                app,
                open: url as URL?,
                sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as! String,
                annotation: options[UIApplication.OpenURLOptionsKey.annotation])

        }
}

Step 3: put this code into `info.plist'

<key>CFBundleURLTypes</key>
     <array>
         <dict>
             <key>CFBundleURLSchemes</key>
             <array>
                 <string>fb1111111111111111</string>
             </array>
         </dict>


     </array>
     <key>CFBundleVersion</key>
        <string>2</string>
     <key>FacebookAppID</key>
        <string>1111111111111111</string>
     <key>FacebookDisplayName</key>
        <string>Together Deal</string>
     <key>LSApplicationQueriesSchemes</key>
        <array>
            <string>fbapi</string>
            <string>fb-messenger-api</string>
            <string>fbauth2</string>
            <string>fbshareextension</string>
        </array>

Solution 2

Here is the code of

1. ViewController.swift

import UIKit

import FacebookLogin
import FBSDKLoginKit

class ViewController: UIViewController {

    var dict : [String : AnyObject]!

    override func viewDidLoad() {
        super.viewDidLoad()

        //creating button
        let loginButton = LoginButton(readPermissions: [ .publicProfile ])
        loginButton.center = view.center

        //adding it to view
        view.addSubview(loginButton)

        //if the user is already logged in
        if let accessToken = FBSDKAccessToken.current(){
            getFBUserData()
        }

    }

    //when login button clicked
    @objc func loginButtonClicked() {
        let loginManager = LoginManager()
        loginManager.logIn([ .publicProfile ], viewController: self) { loginResult in
            switch loginResult {
            case .failed(let error):
                print(error)
            case .cancelled:
                print("User cancelled login.")
            case .success(let grantedPermissions, let declinedPermissions, let accessToken):
                self.getFBUserData()
            }
        }
    }

    //function is fetching the user data
    func getFBUserData(){
        if((FBSDKAccessToken.current()) != nil){
            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
                if (error == nil){
                    self.dict = result as! [String : AnyObject]
                    print(result!)
                    print(self.dict)
                }
            })
        }
    }
}

2. AppDelegate.swift

import UIKit
import FBSDKLoginKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    //added these 3 methods 
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    func applicationWillResignActive(_ application: UIApplication) {
        FBSDKAppEvents.activateApp()
    }

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

    func applicationDidEnterBackground(_ application: UIApplication) {

    }

    func applicationWillEnterForeground(_ application: UIApplication) {

    }

    func applicationDidBecomeActive(_ application: UIApplication) {

    }

    func applicationWillTerminate(_ application: UIApplication) {

    }


}

Source: Facebook Login Swift 3 Tutorial

Share:
13,972
Johny D Good
Author by

Johny D Good

Updated on June 04, 2022

Comments

  • Johny D Good
    Johny D Good about 2 years

    please help me with Facebook login

    I've started with putting into pod

    pod 'FacebookCore'
    pod 'FacebookLogin'
    pod 'FacebookShare'
    and then run pod install
    

    after this i've imported this into my viewController

    import UIKit
    import FacebookCore
    import FacebookLogin
    
    class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let loginButton = LoginButton(readPermissions: [ .publicProfile ])
        loginButton.center = view.center
        view.addSubview(loginButton)
    }
    
        override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
        }
    
    
    }
    

    I updated info.plist with Facebook data

    how Do i get user basic profile data once user has authorized app? What goes in AppDelegate file?

    thanks