transferir restaurar pasar mensajes google desde ios facebook swift session facebook-ios-sdk

ios - restaurar - transferir mensajes de whatsapp de android a iphone



iOS SDK 4 de Facebook SesiĆ³n (2)

Tengo un problema con el nuevo FacebookSDK para iOS.

Puedo iniciar sesión correctamente y recuperar la información necesaria, pero cuando abro mi aplicación nuevamente y tengo la intención de omitir el proceso de inicio de sesión, la sesión que estoy verificando es nula.

Este es mi AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window!.rootViewController = LogInViewController() self.window!.makeKeyAndVisible() FBSDKProfile.enableUpdatesOnAccessTokenChange(true) return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) } func applicationDidBecomeActive(application: UIApplication) { FBSDKAppEvents.activateApp() } }

Y este es mi controlador de vista de inicio de sesión de Facebook:

class LogInViewController: UIViewController, FBSDKLoginButtonDelegate { // MARK: Properties @IBOutlet weak var logInView: FBSDKLoginButton! // MARK: Init init() { super.init(nibName: "LogInViewController", bundle: nil) } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: View Delegates override func viewDidLoad() { super.viewDidLoad() if (FBSDKAccessToken.currentAccessToken() != nil) { // User is already logged in, do work such as go to next view controller. println(FBSDKAccessToken.currentAccessToken().tokenString) self.goToNavigation() } else { logInView.readPermissions = ["public_profile", "email", "user_friends"] logInView.delegate = self } } // MARK: Facebook Delegate Methods 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 returnUserData() } } } func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { println("User Logged Out") } func returnUserData() { let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil) graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in if ((error) != nil) { // Process error println("Error: /(error)") } else { println("fetched user: /(result)") let userName : NSString = result.valueForKey("name") as! NSString println("User Name is: /(userName)") let userEmail : NSString = result.valueForKey("email") as! NSString println("User Email is: /(userEmail)") } self.goToNavigation() }) } func goToNavigation() { // Creating a navigation controller with MainMenuViewController at the root of the navigation stack. let navController = UINavigationController(rootViewController: MainMenuViewController()) self.presentViewController(navController, animated:true, completion: nil) } }

Cuando estoy comprobando if (FBSDKAccessToken.currentAccessToken() != nil) siempre obtengo nulo para una sesión, aunque el título del botón es "Cerrar sesión".

Cual podría ser el problema aquí? Cualquier sugerencia es bienvenida!


Resuelto Muchas gracias por las sugerencias, ¡Vijay Masiwal!

Al igual que en la publicación sugerida, resolví el problema utilizando un observador NSNotificationCenter para FBSDKAccessTokenDidChangeNotification:

override func viewDidLoad() { super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver(self, selector:"checkLogIn", name: FBSDKAccessTokenDidChangeNotification, object: nil) } func checkLogIn() { if (FBSDKAccessToken.currentAccessToken() != nil) { // User is already logged in, do work such as go to next view controller. println(FBSDKAccessToken.currentAccessToken().tokenString) self.goToNavigation() } else { logInView.readPermissions = ["public_profile", "email", "user_friends"] logInView.delegate = self } }


La respuesta de ti mismo es buena. Para obtener más información, puede usar el botón de Facebook personalizado y puede llamar a la solicitud de obtención de datos cuando el token de acceso se ajusta al proceso de inicio de sesión.

Inicie sesión con un botón personalizado y un token de acceso.

Obtenga información del usuario en facebook sdk 4.x

Rápido

@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.containsObject("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) } }) } }

Salida:

{ email = "[email protected]"; "first_name" = Ashish; id = 910855688971343; "last_name" = Kakkad; name = "Ashish Kakkad"; picture = { data = { "is_silhouette" = 0; url = "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpf1/v/t1.0-1/p200x200/10394859_900936369963275_5557870055628103117_n.jpg?oh=fefbfca1272966fc78286c36741f9ac6&oe=55C89225&__gda__=1438608579_9133f15e55b594f6ac2306d61fa6b6b3"; }; }; }

C objetivo

Iniciar sesión con Facebook SDK 4.x

Agregue el siguiente código al botón de inicio de sesión de Facebook, haga clic en:

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if (error) { // Error } else if (result.isCancelled) { // Cancelled } else { if ([result.grantedPermissions containsObject:@"email"]) { [self getFBResult]; } } }];

Obtener el método de resultado de Facebook:

-(void)getFBResult { if ([FBSDKAccessToken currentAccessToken]) { [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, first_name, last_name, picture.type(large), email"}] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSLog(@"fb user info : %@",result); } else { NSLog(@"error : %@",error); } }]; } }

Puede cambiar los campos de permisos que desee.