如何获取Facebook SDK的用户名和电子邮件ID?

时间:2014-02-25 09:54:49

标签: ios objective-c iphone facebook

我使用的代码

 if (FBSession.activeSession.state == FBSessionStateOpen
        || FBSession.activeSession.state == FBSessionStateOpenTokenExtended) {

        // Close the session and remove the access token from the cache
        // The session state handler (in the app delegate) will be called automatically
        [FBSession.activeSession closeAndClearTokenInformation];


        // If the session state is not any of the two "open" states when the button is clicked
    } else {
        // Open a session showing the user the login UI
        // You must ALWAYS ask for basic_info permissions when opening a session
        [FBSession openActiveSessionWithReadPermissions:@[@"basic_info,email"]
                                           allowLoginUI:YES
                                      completionHandler:
         ^(FBSession *session, FBSessionState state, NSError *error) {




             // Retrieve the app delegate
             AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
             // Call the app delegate's sessionStateChanged:state:error method to handle session state changes
             [appDelegate sessionStateChanged:session state:state error:error];
         }];
    }

从这段代码我需要获取用户名和邮件ID。如果有人知道解决方案,请提前帮助我。

12 个答案:

答案 0 :(得分:16)

  if ([FBSDKAccessToken currentAccessToken]) {
                     [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"email,name,first_name"}]
                      startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                          if (!error) {
                              NSLog(@"fetched user:%@", result);
                               NSLog(@"%@",result[@"email"]);

                          }
                      }];


                 }

答案 1 :(得分:12)

使用以下代码

 FBSession *session = [[FBSession alloc] initWithPermissions:@[@"basic_info", @"email"]];
    [FBSession setActiveSession:session];

    [session openWithBehavior:FBSessionLoginBehaviorForcingWebView
            completionHandler:^(FBSession *session,
                                FBSessionState status,
                                NSError *error) {
                if (FBSession.activeSession.isOpen) {
                    [[FBRequest requestForMe] startWithCompletionHandler:
                     ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
                         if (!error) {
                              NSLog(@"accesstoken %@",[NSString stringWithFormat:@"%@",session.accessTokenData]);
                             NSLog(@"user id %@",user.id);
                             NSLog(@"Email %@",[user objectForKey:@"email"]);
                             NSLog(@"User Name %@",user.username);
                         }
                     }];
                }
            }];

答案 2 :(得分:3)

用于新代码facebook SDK ver 4.0及以上版本

请参阅此link

以下

 //  use facebook SDK 3.8 

在AppDelegate.m中添加以下方法

 -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:  (NSString *)sourceApplication annotation:(id)annotation
{
return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication  fallbackHandler:^(FBAppCall *call)
        {
            NSLog(@"Facebook handler");
        }
        ];
}


- (void)applicationDidBecomeActive:(UIApplication *)application
{
[FBAppEvents activateApp];
[FBAppCall handleDidBecomeActive];
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application
{
 [FBSession.activeSession close];
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

查看viewcontroler .h中的以下代码

#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController<FBLoginViewDelegate>


@property (strong, nonatomic) IBOutlet UILabel *lblUserName;
@property (strong, nonatomic) IBOutlet UITextField *txtEmailId;
@property (strong, nonatomic) IBOutlet UIButton *lblCreate;
@property (strong, nonatomic) IBOutlet FBProfilePictureView *profilePic;

@property (strong, nonatomic) id<FBGraphUser> loggedInUser;

- (IBAction)butCreate:(id)sender;

- (void)showAlert:(NSString *)message
       result:(id)result
        error:(NSError *)error;

@end

//将以下代码应用于您的view controller.m

- (void)viewDidLoad
{
[super viewDidLoad];
FBLoginView *loginview=[[FBLoginView alloc]initWithReadPermissions:@[@"email",@"user_likes"]];
loginview.frame=CGRectMake(60, 50, 200, 50);
loginview.delegate=self;
[loginview sizeToFit];
[self.view addSubview:loginview];

}

-(void)loginViewShowingLoggedInUser:(FBLoginView *)loginView
{
self.lblCreate.enabled=YES;
self.txtEmailId.enabled=YES;
self.lblUserName.enabled=YES;


}

-(void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user
{
self.lblUserName.text=[NSString stringWithFormat:@"%@",user.name];
self.txtEmailId.text=[user objectForKey:@"email"];
//self.profilePic.profileID=user.id;
self.loggedInUser=user;
}

-(void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView
{

self.txtEmailId.text=nil;
self.lblUserName.text=nil;
self.loggedInUser=nil;
self.lblCreate.enabled=NO;

}
-(void)loginView:(FBLoginView *)loginView handleError:(NSError *)error{
   NSLog(@"Show the Error ==%@",error);
}

Swift 1.2&amp;上述

创建字典:

class ViewController: UIViewController {
    var dict : NSDictionary!
}

获取数据:

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){
            self.dict = result as NSDictionary               
            println(self.dict)
            NSLog(self.dict.objectForKey("picture")?.objectForKey("data")?.objectForKey("url") as String)
        }
    })
}

输出应为:

{
    email = "karthik.saral@gmail.com";
    "first_name" = Karthi;
    id = 924483474253864;
    "last_name" = keyan;
    name = "karthi keyan";
    picture =     {
        data =         {
            "is_silhouette" = 0;
            url = "XXXXXXX";
        };
    };
}

答案 3 :(得分:1)

成功登录后发出以下请求,您不会为其读取publish_actions权限。

/* make the API call */
[FBRequestConnection startWithGraphPath:@"/me"
                             parameters:nil
                             HTTPMethod:@"GET"
                      completionHandler:^(
                          FBRequestConnection *connection,
                          id result,
                          NSError *error
                      ) {
                          /* handle the result */
                      }];

点击此链接:https://developers.facebook.com/docs/graph-api/reference/user

答案 4 :(得分:1)

您可以使用NSDictionary: NSDictionary<FBGraphUser> *user获取这些信息, 您只需使用objectforkey来访问这些值,例如:

[user objectForKey:@"id"],

[user objectForKey:@"username"],

[user objectForKey:@"email"].

希望它适合你。

答案 5 :(得分:1)

目前适用于最新版本的FB SDK:

在正确设置FB登录按钮之前的某处(假设self.facebookLoginButton通过IB初始化):

self.facebookLoginButton.readPermissions = @[@"public_profile", @"email"];
self.facebookLoginButton.delegate = self;

然后在loginButton:didCompleteWithResult:error:

- (void)loginButton:(FBSDKLoginButton *)loginButton
didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result
              error:(NSError *)error
{
    NSDictionary *parameters = @{@"fields":@"email,name"};
    FBSDKGraphRequest *graphRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters];
    [graphRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
    {
        LogInfo(@"fetched user:%@", result);
    }];
}

以下是帮助的参考页面:https://developers.facebook.com/docs/graph-api/reference/user

答案 6 :(得分:0)

[FBRequestConnection startWithGraphPath:@"/me"
                             parameters:nil
                             HTTPMethod:@"GET"
                      completionHandler:^(
                                          FBRequestConnection *connection,
                                          NSDictionary *result,
                                          NSError *error
                                          ) {
                          /* handle the result */
                          _fbId = [result objectForKey:@"id"];
                          _fbName = [result objectForKey:@"name"];
                          _fbEmail = [result objectForKey:@"email"];

                          NSLog(@"%@",_fbId);
                          NSLog(@"%@",_fbName);
                          NSLog(@"%@",_fbEmail);
                      }];

答案 7 :(得分:0)

使用此代码:

    FBSession *session = [[FBSession alloc] initWithPermissions:@[@"public_profile"]];
    [FBSession setActiveSession:session];

    [session openWithBehavior:FBSessionLoginBehaviorForcingWebView
            completionHandler:^(FBSession *session,
                                FBSessionState status,
                                NSError *error) {
                if (FBSession.activeSession.isOpen)
                {
                    [[FBRequest requestForMe] startWithCompletionHandler:
                     ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error)
                     {
                         if (!error)
                         {
                             NSLog(@"%@", user);
                             [[[UIAlertView alloc] initWithTitle:@"welcome"
                                                         message:[NSString stringWithFormat:@"%@\n%@\n%@\n%@\n%@\n%@",
                                                                  user[@"name"],
                                                                  user[@"gender"],
                                                                  user[@"id"],
                                                                  user[@"link"],
                                                                  user[@"email"],
                                                                  user[@"timezone"]]
                                                        delegate:nil
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil]
                              show];
                         }
                     }];
                }
            }];

答案 8 :(得分:0)

  

facebook ios sdk获取用户名和电子邮件swift 3

 FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email"]).start(completionHandler: { (connection, result, error) -> Void in
            if (error == nil){
                let fbDetails = result as! NSDictionary
                print(fbDetails)
            }else{
                print(error?.localizedDescription ?? "Not found")
            }
        })

答案 9 :(得分:0)

User对象的用户名字段已被删除,并且在Graph API v2.0中不存在。在API的v2.0中,无法获取用户的FB用户名。您可以使用app范围ID作为用户名。

Facebook取消了用户名,因为用户名是通过Facebook发送电子邮件的一种方式。 例如,给定网址http://www.facebook.com/sebastian.trug 相应的Facebook电子邮件将是sebastian.trug@facebook.com 如果通过电子邮件发送,将直接接收消息(如果消息设置设置为公共),否则接收到另一个收件箱。

来源:https://developers.facebook.com/docs/apps/changelog#v2_0_graph_api

这是swift 3.0的代码

     let graphRequest:FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", 
    parameters: ["fields":"first_name,email, picture.type(large)"])

            graphRequest.start(completionHandler: { (connection, result, 
          error) -> Void in

                if ((error) != nil)
                {
                    print("Error: \(error)")
                }
                else
                {
                    let data:[String:AnyObject] = result as! [String : AnyObject]
                    print(data)

                }
            })

答案 10 :(得分:0)

Xcode 8.2.1和Objective-C

在杀死应用后获取任何地方的登录信息

   FBRequest *friendRequest = [FBRequest requestForGraphPath:@"me/?fields=name,picture,birthday,email,location"];
                 [friendRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error)
                  {
                      if(error == nil) {

                          UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Facebook" message:@"Success in fetching Facebook information." delegate:self cancelButtonTitle:@"OK"otherButtonTitles:nil, nil];
                          [alert show];

                      }
                      else
                      {
                          UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Facebook" message:@"Problem in fetching Facebook Information. Try Later!" delegate:self cancelButtonTitle:@"OK"otherButtonTitles:nil, nil];
                          [alert show];
                      }


                  }];

答案 11 :(得分:-2)

  1. 首先,您必须通过GraphAPI获取应用程序的访问权限。
  2. 使用objectandKey创建NSMutableDictionary。 您的对象将是您正在回收的价值,例如您的姓名和您的emailId。

    代码段:

    NSMutableDictionary *params=[[NSMutableDictionary alloc]init];
    
    [params setObject:nameStr forKey:@"name"];
    
    [params setObject:emailStr forKey:@"email"];