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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22010459/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 23:34:19  来源:igfitidea点击:

How to get user name and email id for Facebook SDK?

iosobjective-ciphonefacebook

提问by Peer Mohamed Thabib

The code I have used

我用过的代码

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

from this code i need to get user name and mail id. if any one know the solution please help me thanks in advance.

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

采纳答案by iDeveloper

Use the Following Code

使用以下代码

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

回答by Myaaoonn

  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"]);

                          }
                      }];


                 }

回答by Anbu.Karthik

for new code facebook SDK ver 4.0 and above

对于新代码 facebook SDK ver 4.0 及更高版本

see this link

看到这个链接

below

以下

 //  use facebook SDK 3.8 

add the following methods in AppDelegate.m

在 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:.
}

se the follwing code in your viewcontroler .h

在您的视图控制器 .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

// apply the below code to your view controller.m

// 将以下代码应用到您的视图 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 & above

Swift 1.2 及以上

Create a dictionary :

创建字典:

class ViewController: UIViewController {
    var dict : NSDictionary!
}

Fetching the data :

获取数据:

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

Output should be :

输出应该是:

{
    email = "[email protected]";
    "first_name" = Karthi;
    id = 924483474253864;
    "last_name" = keyan;
    name = "karthi keyan";
    picture =     {
        data =         {
            "is_silhouette" = 0;
            url = "XXXXXXX";
        };
    };
}

回答by Basheer_CAD

Make the following request after successfully login in, you don't read publish_actions permissions for it.

成功登录后发出以下请求,您没有读取它的publish_actions权限。

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

follow this link: https://developers.facebook.com/docs/graph-api/reference/user

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

回答by Irfan

You can get these information by using the NSDictionary: NSDictionary<FBGraphUser> *user, you just need to use objectforkeyto access these values like :

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

[user objectForKey:@"id"],

[user objectForKey:@"username"],

[user objectForKey:@"email"].

Hopefully it will work for you.

希望它对你有用。

回答by Stunner

This currently works with the latest version of the FB SDK:

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

Somewhere before set up the FB login button correctly (assuming self.facebookLoginButtonis initialized via IB):

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

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

Then in loginButton:didCompleteWithResult:error::

然后在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);
    }];
}

Here is the reference page that helped: https://developers.facebook.com/docs/graph-api/reference/user

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

回答by Girish P

The username field of the User object has been removed, and does not exist in Graph API v2.0. In v2.0 of the API is there is no way to get the FB username of a user.you can use app scope id though as username.

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

Facebook got rid of the username because the username is one way of sending emails via Facebook. For example, given the url http://www.facebook.com/sebastian.trugthe corresponding Facebook email would be [email protected] which, if emailed, would be received to messages directly (if the message setting is set to public), otherwise to the other inbox.

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

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

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

here is the code for swift 3.0

这是 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)

                }
            })

回答by Saumil Shah

Xcode 8.2.1 and Objective-C

Xcode 8.2.1 和 Objective-C

Getting login information any of the place after killing the app

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

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


                  }];

回答by Raj Joshi

facebook ios sdk get user name and email swift 3

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

回答by Cayke Prudente

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