简体   繁体   English

iOS Facebook SDK 4会话

[英]iOS Facebook SDK 4 Session

I'm having a problem with the new FacebookSDK for iOS. 我在iOS上使用新的FacebookSDK遇到问题。

I can successfully login and get back necessary information, but when I open my app again and I intend to skip the login process, the session that I'm verifying is null. 我可以成功登录并获取必要的信息,但是当我再次打开应用程序并且打算跳过登录过程时,我正在验证的会话为空。

This is my AppDelegate: 这是我的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()
}
}

And this is my Facebook LogIn View Controller: 这是我的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)
}
}

When I'm checking if (FBSDKAccessToken.currentAccessToken() != nil) I always get null for a session, although the button title is "Log out". 当我检查if (FBSDKAccessToken.currentAccessToken() != nil) ,尽管按钮标题为“注销”,但我始终为会话获取null。

What could be the problem here? 这可能是什么问题? Any suggestions are welcome! 欢迎任何建议!

Answer of yourself is good. 你自己的回答是好的。 For more information you can use custom facebook button and you can call the fetch data request when the access token actually get by the login process. 有关更多信息,您可以使用自定义facebook按钮,并且可以在登录过程实际获得访问令牌时调用获取数据请求。

Login with custom button and access token. 使用自定义按钮登录并访问令牌。

Get user info in facebook sdk 4.x 在Facebook SDK 4.x中获取用户信息

Swift 迅速

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

Output : 输出:

{
    email = "ashishkakkad8@gmail.com";
    "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";
        };
    };
}

Objective-C 目标C

Login with Facebook SDK 4.x 使用Facebook SDK 4.x登录

Add following code to facebook login button click : 将以下代码添加到facebook登录按钮,单击:

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];
         }
     }
}];

Get Facebook Result Method : 获取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);
             }
         }];   
    }
}

You can change the fields of permissions as you want. 您可以根据需要更改权限字段。

Solved! 解决了! Thanks a bunch for the suggestions, Vijay Masiwal! 非常感谢您的建议,Vijay Masiwal!

Like in the suggested post, I solved the issue by using a NSNotificationCenter observer for FBSDKAccessTokenDidChangeNotification: 就像在建议的帖子中一样,我通过为FBSDKAccessTokenDidChangeNotification使用NSNotificationCenter观察器解决了该问题:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM