Facebook iOS SDK и быстрый: как получить изображение профиля пользователя
У меня встроенный Facebook sdk в Xcode 6 (с быстрым).
Во время входа я запрашиваю разрешение 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;
}
P.S: xxx для конфиденциальности
Ответы
Ответ 1
Изображение профиля на самом деле общедоступно, и вы можете просто добавить идентификатор пользователя к адресу, указанному в URL-адресе профиля изображения, например:
var userID = user["id"] as NSString
var facebookProfileUrl = "http://graph.facebook.com/\(userID)/picture?type=large"
Этот конкретный адрес URL должен возвращать "большую" версию изображения профиля пользователя, но в документах в документах доступны еще несколько параметров фотографии.
Ответ 2
Если вы хотите получить изображение в том же запросе, что и остальные сведения о пользователях, вы можете сделать все это в одном графическом запросе. Это немного грязно, но это бьет, делая другой запрос.
Более подход 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 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
}
})
Ответ 3
С помощью Facebook SDK 4.0 вы можете использовать:
Swift:
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]);
}}];
Ответ 4
если вы хотите получить увеличенное изображение, просто замените "type = large" на 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]); }
}];
Ответ 5
Для быстрого это простой способ получить 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)")
}
})
}
Ответ 6
@Решение Brandon Gao дало мне миниатюру 200X200...
Чтобы получить больший размер, я использовал FBSDKProfile
, чтобы получить путь с размером, который также является более модульным и не жестко закодированным (хотя мне приходилось вводить часть graph.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...:\