iOS Facebook SDK 4会话 [英] iOS Facebook SDK 4 Session

查看:107
本文介绍了iOS Facebook SDK 4会话的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对iOS的新的 FacebookSDK 有问题。

I'm having a problem with the new FacebookSDK for iOS.

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

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.

这是我的AppDelegate:

This is my 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:

And this is my 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)我总是为空会话,尽管按钮标题是注销。

When I'm checking if (FBSDKAccessToken.currentAccessToken() != nil) I always get null for a session, although the button title is "Log out".

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

What could be the problem here? Any suggestions are welcome!

推荐答案

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

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.

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

Login with custom button and access token.

获取用户信息在facebook sdk 4.x

Get user info in 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.x登录

Objective-C

Login with Facebook SDK 4.x

将以下代码添加到Facebook登录按钮点击:

Add following code to facebook login button click :

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结果方法:

Get Facebook Result Method :

-(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.

这篇关于iOS Facebook SDK 4会话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆