iOS Facebook SDK 4会话

我遇到了iOS的新FacebookSDK的问题。

我可以成功login并获取必要的信息,但是当我再次打开我的应用程序时,我打算跳过login过程,正在validation的会话为空。

这是我的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() } } 

这是我的Facebook LogIn视图控制器:

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

当我检查if (FBSDKAccessToken.currentAccessToken() != nil)我总是得到一个会话为空,尽pipebutton标题是“注销”。

这里可能是什么问题? 任何build议,欢迎!

你自己的答案是好的。 有关更多信息,您可以使用自定义Facebookbutton,并且当login进程实际获取访问令牌时,您可以调用获取数据请求。

用自定义button和访问令牌login。

获取facebook sdk 4.x中的用户信息

迅速

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

输出:

 { 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的

用Facebook SDK 4.xlogin

将以下代码添加到Facebookloginbutton单击:

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

获取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); } }]; } } 

您可以根据需要更改权限字段。

解决了! 感谢一堆的build议,Vijay Masiwal!

就像在build议的post中,我通过使用NSNotificationCenter的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 } }