iOS Facebook SDK 4会话

时间:2015-05-20 10:22:28

标签: ios facebook swift session facebook-ios-sdk

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

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

这是我的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 View Controller:

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)时,我总是为会话获取null,尽管按钮标题是“注销”。

这可能是什么问题? 欢迎任何建议!

2 个答案:

答案 0 :(得分:3)

回答你自己很好。有关更多信息,您可以使用自定义Facebook按钮,并且当访问令牌实际通过登录过程获取时,您可以调用获取数据请求。

使用自定义按钮和访问令牌登录。

在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";
        };
    };
}

目标C

使用Facebook SDK 4.x登录

将以下代码添加到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];
         }
     }
}];

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

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

答案 1 :(得分:1)

解决! 非常感谢你的建议,Vijay Masiwal!

与建议的帖子一样,我通过使用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
    }
}