从 Facebook iOS 7 获取用户名和头像

Posted

技术标签:

【中文标题】从 Facebook iOS 7 获取用户名和头像【英文标题】:Getting username and profile picture from Facebook iOS 7 【发布时间】:2013-12-17 00:30:43 【问题描述】:

我已经阅读了很多关于从 Facebook 获取信息的教程,但到目前为止我都失败了。我只想从 Facebook 获取用户名和头像。

- (IBAction)login:(id)sender 

   [FBSession openActiveSessionWithReadPermissions:@[@"email",@"user_location",@"user_birthday",@"user_hometown"]
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error) 

   switch (state) 
      case FBSessionStateOpen:
         [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) 
            if (error) 
               NSLog(@"error:%@",error);
             else 
               // retrive user's details at here as shown below
               NSLog(@"FB user first name:%@",user.first_name);
               NSLog(@"FB user last name:%@",user.last_name);
               NSLog(@"FB user birthday:%@",user.birthday);
               NSLog(@"FB user location:%@",user.location);
               NSLog(@"FB user username:%@",user.username);
               NSLog(@"FB user gender:%@",[user objectForKey:@"gender"]);
               NSLog(@"email id:%@",[user objectForKey:@"email"]);
               NSLog(@"location:%@", [NSString stringWithFormat:@"Location: %@\n\n",
                                                                         user.location[@"name"]]);

             
        ];
        break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
           [FBSession.activeSession closeAndClearTokenInformation];
        break;
        default:
        break;
       

    ];


 

我使用此代码获取信息,但我无法获取任何信息。 你能帮帮我吗?或者您可以更喜欢教程来阅读它吗?我已阅读 developer.facebook.com 上的教程。

感谢您的关注。

【问题讨论】:

【参考方案1】:

这是我找到的获取用户头像的最简单方法。

[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *FBuser, NSError *error) 
    if (error) 
      // Handle error
    

    else 
      NSString *userName = [FBuser name];
      NSString *userImageURL = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", [FBuser objectID]];
    
  ];

其他可以使用的查询参数有:

类型:小、普通、大、方形 宽度高度: 同时使用 widthheight 来获得裁剪后的纵横比填充图像

【讨论】:

在这段代码之前我需要做些什么吗?因为当我按下按钮时,它不会进入 if 语句。 好吧,SDK 教程 (developers.facebook.com/docs/ios/ios-sdk-tutorial) 中描述了一些初始化。我假设您已按照这些步骤操作。 我想我做到了:)。我从 Facebook 获得了一个 appID,并在 .plist 文件中写入了这些信息。这些就足够了,还是我需要先登录才能获取信息? 设置 Facebook SDK 有点棘手。如果您已经设置了应用 ID,请按照登录教程 (developers.facebook.com/docs/ios/login-tutorial),然后您应该准备好提取用户数据。 请注意,并非所有用户都有用户名,在这种情况下,您不能使用该名称,因为它可能有歧义。您可以使用用户的 id 来创建 url【参考方案2】:
if ([FBSDKAccessToken currentAccessToken]) 
    [[[FBSDKGraphRequest alloc] initWithGraphpath:@"me" parameters:@ @"fields" : @"id,name,picture.width(100).height(100)"]startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
        if (!error) 
            NSString *nameOfLoginUser = [result valueForKey:@"name"];
            NSString *imageStringOfLoginUser = [[[result valueForKey:@"picture"] valueForKey:@"data"] valueForKey:@"url"];
            NSURL *url = [[NSURL alloc] initWithURL: imageStringOfLoginUser];
            [self.imageView setImageWithURL:url placeholderImage: nil];
        
    ];

【讨论】:

谢谢,在 Facebook 文档的链接下方:developers.facebook.com/docs/ios/graph#fetching 而不是 [[NSURL alloc] initWithURL: imageStringOfLoginUser]; 应该是 [[NSURL alloc] initWithString: imageStringOfLoginUser]; 或更简单的 NSURL *url = [NSURL URLWithString:imageStringOfLoginUser];【参考方案3】:

发出以下图表请求:

/me?fields=name,picture.width(720).height(720)url

你会得到非常大而且很酷的头像:


  "id": "459237440909381",
  "name": "Victor Mishin", 
  "picture": 
    "data": 
      "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpf1/t31.0-1/c628.148.1164.1164/s720x720/882111_142093815957080_669659725_o.jpg"
    
  

附: /me?fields=picture.type(large) 不适合我。

【讨论】:

【参考方案4】:

您还可以通过以下方式获取用户名和图片:

[FBSession openActiveSessionWithReadPermissions:@[@"basic_info"]
                                           allowLoginUI:YES
                                      completionHandler:
         ^(FBSession *session, FBSessionState state, NSError *error) 

             if(!error && state == FBSessionStateOpen) 
                  [FBRequestConnection startWithGraphPath:@"me" parameters:[NSMutableDictionary dictionaryWithObjectsAndKeys:@"id,name,first_name,last_name,username,email,picture",@"fields",nil] HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
                             NSDictionary *userData = (NSDictionary *)result;
                             NSLog(@"%@",[userData description]);
                         ];
                 
             
         ];

Output:
picture =     
        data =         
            "is_silhouette" = 0;
            url = "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-frc1/t5.0-1/xxxxxxxxx.jpg";
        ;
    ;
    username = xxxxxxxxx;

您可以将参数保留为图片和用户名,并根据您的要求排除其他参数。 HTH。

【讨论】:

谢谢!比发出 2 个请求更简单的方法【参考方案5】:

这是 Facebook SDK 4 和 Swift 的代码:

if FBSDKAccessToken.currentAccessToken() != nil 
    FBSDKGraphRequest(graphPath: "me", parameters: nil).startWithCompletionHandler( (connection, result, error) -> Void in
        println("This logged in user: \(result)")
        if error == nil
            if let dict = result as? Dictionary<String, AnyObject>
                println("This is dictionary of user infor getting from facebook:")
                println(dict)
            
        
    )

回答问题的更新:

要下载公开个人资料图片,您可以从字典中获取 facebook ID:

let facebookID:NSString = dict["id"] as AnyObject? as NSString

然后使用 facebook ID 调用对图形 API 的请求:

let pictureURL = "https://graph.facebook.com/\(fbUserId)/picture?type=large&return_ssl_resources=1"

示例代码:

    let pictureURL = "https://graph.facebook.com/\(fbUserId)/picture?type=large&return_ssl_resources=1"
    //
    var URLRequest = NSURL(string: pictureURL)
    var URLRequestNeeded = NSURLRequest(URL: URLRequest!)
    println(pictureURL)



    NSURLConnection.sendAsynchronousRequest(URLRequestNeeded, queue: NSOperationQueue.mainQueue(), completionHandler: (response: NSURLResponse!,data: NSData!, error: NSError!) -> Void in
        if error == nil 
            //data is the data of profile image you need. Just create UIImage from it

        
        else 
            println("Error: \(error)")
        
    )

【讨论】:

其实我找到了一个更好的方法,你可以创建一个dictionary,键为“fields”,值为“id,email, first_name, ... , picture.type(large)" -> 然后将其传入参数(而不是 nil) -> 然后您将获得图片信息以及其他所有信息。 @IslamQ。你在哪里找到这些信息的?我想知道我还能在“字段”中添加什么。【参考方案6】:

实际上使用“http://graph.facebook.com//picture?type=small”来获取用户甚至好友的头像很慢。

将 FBProfilePictureView 对象添加到您的视图并在其 profileID 属性中分配用户的 Facebook id 的更好更快的方法。

例如: FBProfilePictureView *friendsPic;

friendsPic.profileID = @"1379925668972042";

【讨论】:

【参考方案7】:

查看这个库: https://github.com/jonasman/JNSocialDownload

你甚至可以得到推特

【讨论】:

以上是关于从 Facebook iOS 7 获取用户名和头像的主要内容,如果未能解决你的问题,请参考以下文章

iOS 获取用户的 Facebook ID 和好友列表以及好友的头像 URL

在 iOS Facebook SDK 中获取并显示用户的头像

iOS7 访问用户 Facebook 头像

Facebook API for iOS, 获取好友头像

ios、facebook 和获取个人资料图片

获取 Facebook API 个人资料图片 ios Swift