FacebookSDK (4.1.x) Bouton d'interface user personnalisée – Swift (1.2)

Suite à ce tutoriel , j'ai réussi à faire fonctionner un button de connection Facebook. Cependant, il atsortingbue automatiquement l'image du button à partir du SDK et il n'est pas personnalisable (car il n'est pas créé sur Storyboard), donc je ne peux pas utiliser mon propre button image ou text à la place.

Je crois que cette partie du code (dans ViewDidLoad) assigne le button:

let loginView : FBSDKLoginButton = FBSDKLoginButton() self.view.addSubview(loginView) loginView.center = self.view.center loginView.readPermissions = ["public_profile", "email"] loginView.delegate = self 

Ce que je dois faire est de créer un button @IBOutlet sur Storyboard et le personnaliser à partir de là. Comment puis je faire ça?

Connectez-vous avec un button personnalisé et un jeton d'access.

Obtenez des informations sur l'user dans facebook sdk 4.x

Rapide

 @IBAction func btnFBLoginPressed(sender: AnyObject) { var fbLoginManager : FBSDKLoginManager = FBSDKLoginManager() fbLoginManager .logInWithReadPermissions(["email"], handler: { (result, error) -> Void in if (error == nil){ var fbloginresult : FBSDKLoginManagerLoginResult = result if(fbloginresult.grantedPermissions.contains("email")) { self.getFBUserData() fbLoginManager.logOut() } } }) } 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){ println(result) } }) } } 

Réponse mise à jour en utilisant le dernier SDK Facebook (01/05/2016) et Swift 2.1

Créez un UIButton avec Interface Builder ou par code et liez l'action de ce button avec ceci:

 @IBAction func loginFacebookAction(sender: AnyObject) { 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() } } } } 

La casse du code précédent triggers la fonction self.getFBUserData () de sorte que vous devez implémenter cette fonction dans le même file

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

Je l'ai fait avec succès dans xcode 7.3

  @IBAction func fbLoginBtnAction(sender: AnyObject) { let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager() fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self, handler: {(result, error) -> Void in if error == nil { print("Logged in through facebook" ) self.getFBUserData() } else { print("Facebook Login Error----\n",error) } } ) } 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){ print(result) } }) } } 

Si vous voulez utiliser le button natif, essayez ceci:

 let buttonText = NSAtsortingbutedSsortingng(ssortingng: "your text here") facebookButton.setAtsortingbutedTitle(buttonText, for: .normal) 

En Juin 2017, la réponse acceptée mis à jour pour Swift 3 et la dernière version de FBSDK, le code ressemble à ci-dessous

 @IBAction func fbLoginPressed(_ sender: Any) { let fbLoginManager: FBSDKLoginManager = FBSDKLoginManager() fbLoginManager.logIn(withReadPermissions: ["email"], from: self) { (result, error) in if error == nil { if let fbLoginResult = result { if fbLoginResult.grantedPermissions != nil && 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: { (cnnection, result, error) in if error == nil{ print(result ?? "Error in getFBUserdata function") } }) } } 

Classe réutilisable (Swift 4).

Utilisation: FacebookSignIn.shared.signIn(from: yourVC, completion: yourCompletion)

 class FacebookSignIn { enum Error: Swift.Error { case unableToInitializeGraphRequest case unexpectedGraphResponse case permissionsIsNotGranted case unexpectedLoginResponse case canceled } struct Permissions { static let email = "email" static let profile = "public_profile" static func isValidPermissions(_ permissions: Set<AnyHashable>) -> Bool { return permissions.contains(email) && permissions.contains(profile) } static var permissions: [Ssortingng] { return [email, profile] } } public static let shared = FacebookSignIn() private init() { } } extension FacebookSignIn { func signIn(from: UIViewController, completion: Result<SignInResponse>.Completion?) { let manager = FBSDKLoginManager() manager.loginBehavior = .native if !isValidToken { manager.logOut() } if let token = FBSDKAccessToken.current() { let interval = token.expirationDate.timeIntervalSince(Date()) if interval > 300 { // At least 5 min token will be valid performLogin { switch $0 { case .failure(let error): completion?(.failure(error)) case .success(let info): completion?(.success(SignInResponse(accessToken: token.tokenSsortingng, userInfo: info))) } } } else { FBSDKAccessToken.refreshCurrentAccessToken { [weak self] _, _, error in if let error = error { manager.logOut() completion?(.failure(error)) } else { let token = FBSDKAccessToken.current()?.tokenSsortingng ?? "" // Should be always valid value at this point. self?.performLogin { switch $0 { case .failure(let error): completion?(.failure(error)) case .success(let info): completion?(.success(SignInResponse(accessToken: token, userInfo: info))) } } } } } } else { manager.logIn(withReadPermissions: Permissions.permissions, from: from) { [weak self] result, error in if let error = error { manager.logOut() completion?(.failure(error)) return } guard let result = result else { manager.logOut() completion?(.failure(Error.unexpectedLoginResponse)) return } let permissions = result.grantedPermissions ?? Set<AnyHashable>() let token = result.token?.tokenSsortingng ?? "" // Should be always valid value at this point. if result.isCancelled { manager.logOut() completion?(.failure(Error.canceled)) } else if Permissions.isValidPermissions(permissions) { self?.performLogin { switch $0 { case .failure(let error): completion?(.failure(error)) case .success(let info): completion?(.success(SignInResponse(accessToken: token, userInfo: info))) } } } else { manager.logOut() completion?(.failure(Error.permissionsIsNotGranted)) } } } } private var isValidToken: Bool { guard let token = FBSDKAccessToken.current() else { return false } return Permissions.isValidPermissions(token.permissions ?? Set<AnyHashable>()) } private func makeGraphRequest() -> FBSDKGraphRequest? { guard FBSDKAccessToken.current().tokenSsortingng != nil else { return nil } // You might not get email: https://developers.facebook.com/docs/facebook-login/permissions/v2.4 // Note, even if you request the email permission it is not guaranteed you will get an email address. For example, // if someone signed up for Facebook with a phone number instead of an email address, the email field may be empty. let fields = "email,id,first_name,last_name,gender" return FBSDKGraphRequest(graphPath: "me", parameters: ["fields": fields]) } private func performLogin(completion: Result<[Ssortingng: Ssortingng]>.Completion?) { let manager = FBSDKLoginManager() guard let request = makeGraphRequest() else { manager.logOut() completion?(.failure(Error.unableToInitializeGraphRequest)) return } _ = request.start { _, result, error in if let e = error { manager.logOut() completion?(.failure(e)) } else if let result = result as? [Ssortingng: Ssortingng] { completion?(.success((result))) } else { manager.logOut() completion?(.failure(Error.unexpectedGraphResponse)) } } } } 

 public struct SignInResponse { public let accessToken: Ssortingng public let userInfo: [Ssortingng: Ssortingng] public init(accessToken: Ssortingng, userInfo: [Ssortingng: Ssortingng]) { self.accessToken = accessToken self.userInfo = userInfo } } public enum Result<T> { case success(T) case failure(Swift.Error) public typealias Completion = (Result<T>) -> Void }