2015-04-20 9 views
8

In Xcode se creo un UIView e quindi aggiungo la classe personalizzata come FBSDKLoginButton, quando faccio clic su di esso mi conduce attraverso l'accesso Facebook e quindi mi riporta alla stessa pagina del FBSDKLoginButton ma invece di dire login pulsante dice che disconnetti ora. Come farei a far sì che quando si fa clic sul pulsante di accesso, si ottenga una nuova visualizzazione?Pulsante di accesso Facebook per Swift


Ho scaricato l'SDK di Facebook attraverso cocoapods e la sua la mia prima volta che lavorano con esso in modo Sono confuso su questo. Grazie per l'aiuto!

+0

Si dovrebbe controllare per il successo a callback (cioè registrati nel = successo) nella vista. Se hai effettuato l'accesso, puoi "reindirizzare" a un'altra vista. –

+0

Questa potrebbe essere una domanda stupida, ma come faccio a fare questo poiché non c'è un codice reale nel controller di visualizzazione? – Soporificdreamer

risposta

20

Un'opzione sarebbe quella di impostare il controller di visualizzazione come delegato di FBSDKLoginButton e implementare il metodo loginButton:didCompleteWithResult:error:, che viene chiamato quando si utilizza il pulsante per accedere.

Swift

class ViewController: UIViewController, FBSDKLoginButtonDelegate { 

    @IBOutlet weak var loginButton: FBSDKLoginButton!   

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.loginButton.delegate = self 
    } 
} 

Obj-C

// ViewController.h 
@interface ViewController : UIViewController <FBSDKLoginButtonDelegate> 

@property (weak, nonatomic) IBOutlet FBSDKLoginButton *loginButton; 

@end 

// ViewController.m 
@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.loginButton.delegate = self; 
} 

Poi, nel metodo loginButton:didCompleteWithResult:error: è possibile controllare il result e error, e se tutto va bene, passare a un'altra vista .

Swift

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
     if ((error) != nil) { 
      // Process error 
     } 
     else if result.isCancelled { 
      // Handle cancellations 
     } 
     else { 
      // Navigate to other view 
     } 
    } 

Obj-C

// ViewController.m 
@implementation ViewController 

- (void)loginButton:(FBSDKLoginButton *)loginButton 
    didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result 
        error:(NSError *)error { 
    if (error) { 
     // Process error 
    } 
    else if (result.isCancelled) { 
     // Handle cancellations 
    } 
    else { 
     // Navigate to other view 
    } 
} 

Potete trovare ulteriori informazioni su come effettuare il login con FB in their docs.

+0

Come funziona l'accesso automatico? – jose920405

0

Si potrebbe fare questo come questo tutorial da appcoda (vedi codice qui sotto)

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.title = @"Facebook Profile"; 

    // Check if user is cached and linked to Facebook, if so, bypass login  
    if ([PFUser currentUser] && [PFFacebookUtils isLinkedWithUser:[PFUser currentUser]]) { 
     [self.navigationController pushViewController: [[UserDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped] animated:NO]; 
    } 

} 


#pragma mark - Login methods 

/* Login to facebook method */ 

- (IBAction)loginButtonTouchHandler:(id)sender { 
    // Set permissions required from the facebook user account 
    NSArray *permissionsArray = @[ @"user_about_me", @"user_relationships", @"user_birthday", @"user_location"]; 

// Login PFUser using facebook 
[PFFacebookUtils logInWithPermissions:permissionsArray block:^(PFUser *user, NSError *error) { 
    [_activityIndicator stopAnimating]; // Hide loading indicator 

    if (!user) { 
     if (!error) { 
      NSLog(@"Uh oh. The user cancelled the Facebook login."); 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Log In Error" message:@"Uh oh. The user cancelled the Facebook login." delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil]; 
      [alert show]; 
     } else { 
      NSLog(@"Uh oh. An error occurred: %@", error); 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Log In Error" message:[error description] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil]; 
      [alert show]; 
     } 
    } else if (user.isNew) { 
     NSLog(@"User with facebook signed up and logged in!"); 
     [self.navigationController pushViewController:[[UserDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped] animated:YES]; 
    } else { 
     NSLog(@"User with facebook logged in!"); 
     [self.navigationController pushViewController:[[UserDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped] animated:YES]; 
     } 
    }]; 

    [_activityIndicator startAnimating]; // Show loading indicator until login is finished 
} 

Ecco un demo app per questo.

+1

Questo mi è venuto in una coda di revisione poiché è stato contrassegnato come una risposta solo di collegamento, che in genere non è considerato buono qui. Posso vedere che hai risposto al commento sulle risposte solo ai link. Ho modificato per riordinare un po 'di formattazione/errori di battitura. –

3

In Swift che sarebbe qualcosa di simile:

class MyViewController: UIViewController, FBSDKLoginButtonDelegate { 
    @IBOutlet weak var loginView : FBSDKLoginButton! 
    @IBOutlet weak var profilePictureView : FBSDKProfilePictureView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.loginView.delegate = self 

     if (FBSDKAccessToken.currentAccessToken() != nil) 
     { 
      performSegueWithIdentifier("unwindToViewOtherController", sender: self) 
     } 
     else 
     { 
      loginView.readPermissions = ["public_profile", "email", "user_friends"] 
     } 

    } 

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

Poi, nel tuo TargetViewController aggiungere una funzione di svolgimento:

@IBAction func unwindToViewOtherController(segue:UIStoryboardSegue) { 
    } 
+0

Grazie bud .. un frammento di quello provato utile! –

+0

'performSegueWithIdentifier (" unwindToViewOtherController ", mittente: self)' inside' if (FBSDKAccessToken.currentAccessToken()! = Nil) 'non sta caricando il prossimo viewcontroller. Ti prego, aiutami con questo ?? – rAzOr

+0

Nello storyboard selezionare la sequenza di svolgimento e quindi l'ispettore degli attributi. Dovresti avere 'unwindToViewOtherController' come ** Identifier ** e' unwindToViewOtherController: 'as ** Action **. –

2

Nella versione FacebookLogin corrente (0.2.0) per Swift, il delegato LoginButton proprietà è definita come proprietà forte:

public class LoginButton: UIView { 
... 
    /// Delegate of the login button that can handle the result, logout events. 
public var delegate: LoginButtonDelegate? 
... } 

Se si aggiunge il login Pulsante seguendo le istruzioni di Facebook e impostare la classe UIViewController bambino come pulsante delegato ...

... verrà creato un ciclo di riferimento. La vista conterrà un forte riferimento al pulsante, il pulsante conterrà un forte riferimento al controller e il controller avrà un forte riferimento alla sua vista, vedi questo post.

La mia soluzione era quella di utilizzare una variabile membro debole per avere un riferimento al pulsante di accesso e quando la vista scompare, il pulsante delegato è impostato a zero, in questo modo:

import UIKit 
import FacebookCore 
import FacebookLogin 
import RxSwift 

class LoginViewController: UIViewController, LoginButtonDelegate { 

    private weak var facebookLoginButton: LoginButton? = nil 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     // Add the Facebook login button 
     let loginButton = LoginButton(readPermissions: [ .publicProfile, .email, .userFriends ]) 
     loginButton.center = view.center 
     // WARNING!: Facebook login button delegate property is defined currently as STRONG. 
     // Therefore, it must be set to nil before leaving the view to avoid reference cycles 
     loginButton.delegate = self 
     view.addSubview(loginButton) 
     // Store the login button as a weak reference, since it is holded by the main view with a 
     // strong reference 
     facebookLoginButton = loginButton 
    } 

    override func willMove(toParentViewController parent: UIViewController?) { 
     super.willMove(toParentViewController:parent) 
     if parent == nil { 
      // The back button was pressed, interactive gesture used, or programatically pop view 
      // was executed 
      // Do not forget to set delegate in Facebook button to nil to break reference cycle. 
      facebookLoginButton?.delegate = nil 
     } 
    } 

    // MARK: - Facebook login 

    /** 
    Called when the button was used to login and the process finished. 

    - parameter loginButton: Button that was used to login. 
    - parameter result:  The result of the login. 
    */ 
    func loginButtonDidCompleteLogin(_ loginButton: LoginButton, result: LoginResult) { 

     switch result { 
      case .failed(let error): 
       // Action on failed 
      case .cancelled: 
       // Action on cancelled 
      case .success(let grantedPermissions, let declinedPermissions, let accessToken): 
       // Action on success 
     } 
    } 

    /** 
    Called when the button was used to logout. 

    - parameter loginButton: Button that was used to logout. 
    */ 
    func loginButtonDidLogOut(_ loginButton: LoginButton) { 

     // Action on logout 
    } 
} 

Non utilizzare la funzione viewWillDissapear() per impostare a nil il delegato, poiché la pagina di accesso di Facebook verrà visualizzata nella parte superiore della tua app, attivando questa funzione e non otterrai il risultato di accesso poiché non sarai più il delegato. Si noti che this solution funziona correttamente per le visualizzazioni all'interno di un controller di navigazione. Un'altra soluzione dovrebbe essere trovata per le finestre modali.

Spero che aiuta, Xavi

+2

Se lasci cadere le righe dicendo "questo è un commento" ... questa in realtà mi sembrerebbe una risposta ;-) – GhostCat

Problemi correlati