ios xcode facebook uiviewcontroller swift3

ios - facebook login swift



Cómo iniciar programáticamente otro ViewController si su usuario está conectado a través de Facebook (3)

Básicamente tengo una clase llamada facebookLogin.swift, la página de inicio de sesión y ViewController.Swift the homepage. He codificado correctamente todas las cosas de inicio de sesión de Facebook y todo funciona; puedo iniciar sesión y cerrar la sesión con el botón que proporciona FBSDK y con el botón personalizado que he definido. Sin embargo, no puedo averiguar cómo ir a la página ViewController.swift si el usuario está conectado.

Aquí está el código facebookLogin.swift:

import UIKit import FBSDKCoreKit import FBSDKLoginKit class facebookLogin: UIViewController, FBSDKLoginButtonDelegate { var loginStatus = false; @IBOutlet weak var facebookOutlet: UIButton! override func viewDidLoad() { super.viewDidLoad() super.viewDidLoad() let loginButton = FBSDKLoginButton() view.addSubview(loginButton) loginButton.center = view.center loginButton.delegate = self; loginButton.readPermissions = ["email","public_profile"] } @IBAction func facebookAction(_ sender: Any) { customFBLogin() if (FBSDKAccessToken.current() != nil) { NSLog("it works") } } func customFBLogin() { FBSDKLoginManager().logIn(withReadPermissions: ["email","public_profile"], from: self) { (result, err) in if err != nil { print("Facebook Login Error Failed /(err)") return; } self.showEmailAddress(); self.loginStatus = true; } } func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { print("Did log out of Facebook") } func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { if error != nil { print(error) return; } else { print("Successfuly logged into Facebook"); showEmailAddress() } } func showEmailAddress() { FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start(completionHandler: { (connection, result, err) in if err != nil { print("Failed to start graph request /(err)") return; } print(result) }) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ }

Aquí está el código relevante del archivo AppDelegate.swift:

import UIKit import CoreData import Firebase import FBSDKCoreKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. FIRApp.configure() FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) let mainStoryBoard = UIStoryboard.init(name: "Main", bundle: nil) self.window = UIWindow(frame: UIScreen.main.bounds) var initialViewController: UIViewController if(FBSDKAccessToken.current() != nil) { let vc = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController") as! ViewController initialViewController = vc } else{ initialViewController = mainStoryBoard.instantiateViewController(withIdentifier: "facebookLogin") } self.window?.rootViewController = initialViewController self.window?.makeKeyAndVisible() return true } func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { let handled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) return handled; }

En la primera función de aplicación en la clase AppDelegate.swift, encontré otro tutorial en stackoverflow que sugería usar este código. Ingresé el código y convertí la sintaxis en swift3, pero la aplicación se rompe cuando la ejecuto. Esto significa que sabe que estoy conectado, pero por alguna razón el segue no se carga y rompe la aplicación. El error que recibo es el Subproceso 1: sigabrt.

Así es como se ven los elementos relevantes en el story board, al principio la vista inicial Controller está a la izquierda y si el usuario está conectado, quiero que la aplicación comience desde viewController a la derecha 1


Tu código parece estar bien. Debería considerar la verificación de Storyboard ID de su ViewController en la sección Identity en la pantalla de diseño de Storyboard. Debes darle a Storyboard ID el nombre de "ViewController". La ID de Storyboard de la pantalla de inicio de sesión debe ser "facebookLogin" de acuerdo con su código.


su token de acceso actual es nulo. Intente verificar en el dispositivo real porque el último FBSDK no almacena token de acceso en el simulador. imprimirá "Volviendo a cargar el token de acceso de NSUserDefaults debido a un error del simulador" en la consola

---- Editar ----

aquí si su token de acceso actual es nulo de lo que irá a la pantalla de inicio de sesión. según su requisito cambio siguiente condición

if(FBSDKAccessToken.current() != nil) { let vc = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController") as! ViewController initialViewController = vc } else { initialViewController = mainStoryBoard.instantiateViewController(withIdentifier: "facebookLogin") }

cambie el ViewController inicial como su requisito.

---- Actualización ----

Puede ignorar esta advertencia, está codificada en el FacebookSDK cuando usa el simulador de iOS. El SDK sí contiene un error que impide que el simulador guarde en caché el token de acceso.

Puede solucionar esto agregando la siguiente línea en FBSDKKeychainStore.m: 94 y FBSDKKeychainStore.m: 135 justo antes:

let key = String(format: "%@_fix", key) UserDefaults().set(key, forKey: value)


Código de Swift 3

// Ver último AccesToken

if let accessToken = AccessToken.current { print("Last AccesToken -/(accessToken)") // Redirect to next screen self.performSegue(withIdentifier:"NextScreen", sender: self) } else { let loginManager = LoginManager() loginManager.loginBehavior = LoginBehavior.web loginManager.logIn([ .publicProfile , .email, .userFriends], viewController: self) { loginResult in switch loginResult { case .failed(let error): print(error) break case .cancelled: print("User cancelled login.") break case .success(let grantedPermissions, let declinedPermissions, let accessToken): print("Logged in! /(grantedPermissions) /(accessToken) /(declinedPermissions)") // Save Current UserInfo let params = ["fields":"id,name,email,picture"] let graphRequest = GraphRequest(graphPath: "me", parameters: params) graphRequest.start { (urlResponse, requestResult) in switch requestResult { case .failed(let error): print(error) case .success(let graphResponse): if let responseDictionary = graphResponse.dictionaryValue { print("/(String(describing: graphResponse.dictionaryValue))") UserDefaults.standard.set(responseDictionary, forKey: "userInfo") } } } self.performSegue(withIdentifier: "NextScreen", sender: self) break } } }