Facebook的iOS SDK和Swift:如何获取用户的个人资料图片

我已经整合了Facebook的SDK在Xcode 6(与迅速)。 在login期间,我请求public_profile权限:

FBSession.openActiveSessionWithReadPermissions(["public_profile"], allowLoginUI: true, completionHandler: { ... ... 

所以我要求用户的信息:

 FBRequestConnection.startForMeWithCompletionHandler { (connection, user, error) -> Void in ... ... 

为什么用户对象不包含个人资料图片? 我怎样才能得到用户个人资料图片? 这不是public_profile的一部分?

我得到以下信息:

 2015-01-25 01:25:18.858 Test[767:23804] { "first_name" = xxx; gender = xxx; id = xxxxxxxxx; "last_name" = xxxxxx; link = "https://www.facebook.com/app_scoped_user_id/xxxxxxxxx/"; locale = "xxxxx"; name = "xxxxxxx xxxxxxx"; timezone = 1; "updated_time" = "2013-12-21T18:45:29+0000"; verified = 1; } 

PS:xxx的隐私

个人资料图片实际上是公开的,您只需将用户标识添加到Facebook的指定个人资料图片url地址,例如:

 var userID = user["id"] as NSString var facebookProfileUrl = "http://graph.facebook.com/\(userID)/picture?type=large" 

这个特定的url地址应该返回用户的个人资料图片的“大”版本,但在文档中还有几个可用的照片选项。

如果您想以与其他用户信息相同的请求获取图片,则可以在一个graphics请求中完成。 这有点凌乱,但它打败了另一个要求。

Swift 3的方法

 let request = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email, picture.type(large)"]) let _ = request?.start(completionHandler: { (connection, result, error) in guard let userInfo = result as? [String: Any] else { return } //handle the error //The url is nested 3 layers deep into the result so it's pretty messy if let imageURL = ((userInfo["picture"] as? [String: Any])?["data"] as? [String: Any])?["url"] as? String { //Download image from imageURL } }) 

Swift 2

 let request = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email, picture.type(large)"]) request.startWithCompletionHandler({ (connection, result, error) in let info = result as! NSDictionary if let imageURL = info.valueForKey("picture")?.valueForKey("data")?.valueForKey("url") as? String { //Download image from imageURL } }) 

使用Facebook SDK 4.0,您可以使用:

迅速:

  let pictureRequest = FBSDKGraphRequest(graphPath: "me/picture?type=large&redirect=false", parameters: nil) pictureRequest.startWithCompletionHandler({ (connection, result, error: NSError!) -> Void in if error == nil { println("\(result)") } else { println("\(error)") } }) 

Objective-C的:

 FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"me/picture?type=large&redirect=false"] parameters:nil HTTPMethod:@"GET"]; [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error){ NSLog(@"result: %@",result);} else { NSLog(@"result: %@",[error description]); }}]; 

如果你想得到更大的图片,只需将“type = large”replace为width = XX&height = XX

但你可以得到的最大的图片是原始图片

 FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/picture?width=1080&height=1080&redirect=false" parameters:nil HTTPMethod:@"GET"]; [request startWithCompletionHandler:^( FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSLog(@"result = %@",result); NSDictionary *dictionary = (NSDictionary *)result; NSDictionary *data = [dictionary objectForKey:@"data"]; NSString *photoUrl = (NSString *)[data objectForKey:@"url"]; } else { NSLog(@"result = %@",[error description]); } }]; 

对于迅速这是获取具有特定大小的照片的url的简单方法:

  let params: [NSObject : AnyObject] = ["redirect": false, "height": 800, "width": 800, "type": "large"] let pictureRequest = FBSDKGraphRequest(graphPath: "me/picture", parameters: params, HTTPMethod: "GET") pictureRequest.startWithCompletionHandler({ (connection, result, error: NSError!) -> Void in if error == nil { print("\(result)") let dictionary = result as? NSDictionary let data = dictionary?.objectForKey("data") let urlPic = (data?.objectForKey("url"))! as! String print(urlPic) } else { print("\(error)") } }) } 

@Brandon Gao解决scheme为我提供了一个200X200的缩略图…为了获得更大的尺寸,我使用了FBSDKProfile来获得一个尺寸较大的path,这个path也是模块化的,并且没有硬编码(尽pipe我必须inputgraph.facebook。 com部分…)

 let size = CGSize(width: 1080, height: 1080) let path = FBSDKProfile.currentProfile().imagePathForPictureMode(.Normal, size: size) let url = "https://graph.facebook.com/\(path)" Alamofire.request(.GET, url, parameters: nil, encoding: ParameterEncoding.URL).response { (request, response, data, error) -> Void in if let imageData = data as? NSData, let image = UIImage(data: imageData) { self.buttonImage.setImage(image, forState: .Normal) } } 

不知何故,我没有得到一个1080X1080图像,但FB给了我一个1117X1117 …:\ \