iOS应用中如何通过Facebook Graph API获取用户照片单张大图?
嘿,我来帮你搞定这个问题——我之前在集成Facebook登录和照片权限时也踩过类似的坑,给你几个实用的解决方案:
先搞清楚错误码6的原因
你调用<OBJECT_ID>/picture时加fields=picture导致错误码6(OAuthException),是因为这个端点不支持fields参数。/{photo-id}/picture本身就是用来获取图片资源的接口,应该通过查询参数(比如type或width)指定尺寸,而不是fields。
方案一:在me/photos请求中直接获取大图链接
你之前用picture.type(large)或picture.width(640)无效,大概率是fields参数的语法没写对。Graph API对嵌套字段的写法有要求,正确的格式应该是把尺寸参数直接跟在picture后面,比如:
代码示例(Objective-C)
// 构造请求,指定fields为id和带尺寸的picture FBSDKGraphRequest *photosRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/photos" parameters:@{@"fields": @"id,picture.width(640)"} HTTPMethod:@"GET"]; [photosRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSArray *photosData = result[@"data"]; for (NSDictionary *photo in photosData) { // 从picture的data字段里取大图URL NSString *largeImageUrl = photo[@"picture"][@"data"][@"url"]; NSLog(@"大图链接:%@", largeImageUrl); // 这里可以把url存下来或者直接加载图片 } } else { NSLog(@"请求失败:%@", error.localizedDescription); } }];
你也可以用picture.type(large)来替代picture.width(640),两者都能返回较大尺寸的图片,具体选哪个看你对尺寸的需求。
方案二:单独请求单张照片的大图(适合需要精准控制尺寸的场景)
如果需要对某张照片单独获取特定尺寸,直接调用该照片的/picture端点,记得加上redirect=false参数(让Facebook返回JSON格式的响应,方便解析url):
代码示例(Objective-C)
NSString *targetPhotoId = @"替换为你拿到的photo id"; // 从me/photos的返回结果里取id FBSDKGraphRequest *singlePhotoRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"/%@/picture", targetPhotoId] parameters:@{@"type": @"large", @"redirect": @"false"} HTTPMethod:@"GET"]; [singlePhotoRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSString *largeImageUrl = result[@"data"][@"url"]; NSLog(@"单张大图链接:%@", largeImageUrl); } else { NSLog(@"请求失败:%@", error.localizedDescription); } }];
这里的type参数可选值有small、normal、large、square,也可以用width和height参数指定具体像素(比如@{@"width": @"1080", @"height": @"1080"}),Facebook会返回最接近该尺寸的图片。
额外提示:确认权限是否真的生效
虽然你已经在readPermissions里加了user_photos,但最好在登录后检查一下用户是否真的授权了这个权限,避免因为授权失败导致获取不到照片:
FBSDKGraphRequest *permissionsRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions" parameters:nil HTTPMethod:@"GET"]; [permissionsRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSArray *permissions = result[@"data"]; BOOL hasPhotosPermission = NO; for (NSDictionary *perm in permissions) { if ([perm[@"permission"] isEqualToString:@"user_photos"] && [perm[@"status"] isEqualToString:@"granted"]) { hasPhotosPermission = YES; break; } } if (!hasPhotosPermission) { // 提示用户重新授权照片权限 } } }];
内容的提问来源于stack exchange,提问作者prat14k

