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.