我为iPhone开发应用程序并使用Facebook API进行一些社交活动。 我必须下载用户的个人资料图片,所以我编写了代码以通过FQL获取其URL并下载它。
首先看起来一切似乎都很好,我的代码有效,但几天后我注意到用户的图片无法下载。 FBSession正确打开,FQL查询执行没有任何错误并返回正确的URL,但我的应用程序无法获取图像数据( [NSData dataWithContentsOfURL:]或NSURLConnection总是在所有情况下开始返回nil数据'请求时间出'错误)。所以我试图从iPhone设备删除我的应用程序并清理Facebook数据,但除了在Facebook开发者门户网站上删除和重新创建我的应用程序帐户之外没有任何帮助。 目前这种奇怪的情况已经重演:最初所有功能都按预期工作,但过了一段时间后,它开始无法下载用户的图片。所以我不知道该怎么做。
那么有人可以帮我解决这个问题吗?提前谢谢!
所有代码均在下方。
1)打开FB会话
FBSessionStateHandler fbCompletion = ^(FBSession *session, FBSessionState status, NSError *error)
{
if (session.isOpen == NO || error != nil)
authCompletion(NO, error);
else
authCompletion(YES, error);
[[FBSession activeSession] setStateChangeHandler:nil];
};
NSArray *readPermissions = @[@"basic_info", @"user_photos"];
BOOL cachedToken = [FBSession openActiveSessionWithReadPermissions:readPermissions allowLoginUI:NO completionHandler:nil];
if (cachedToken)
{
authCompletion(YES, nil);
}
else
{
[FBSession openActiveSessionWithReadPermissions:readPermissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
{
if (error)
{
[[FBSession activeSession] closeAndClearTokenInformation];
[FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) {
[FBSession openActiveSessionWithReadPermissions:readPermissions allowLoginUI:YES completionHandler:fbCompletion];
}];
}
else
fbCompletion(session, status, error);
}];
}
2)执行FQL查询并获取URL
NSString *query = @"SELECT id,width,height,real_height,real_width, url FROM profile_pic WHERE id=me() AND width=260 AND height=260";
NSDictionary *params = @{@"q":query};
FBRequest *usersPictureRequest = [FBRequest requestWithGraphPath:@"fql" parameters:params HTTPMethod:@"GET"];
FBRequestConnection *fbRequestConnection = [[FBRequestConnection alloc] initWithTimeout:k_FBRequesTimeout];
[fbRequestConnection addRequest:usersPictureRequest completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
NSURL *pictureURL = result[@"data.url"];
[self downloadPictureWithURL:pictureURL];
}];
[fbRequestConnection start];
3)下载图片数据:
NSBlockOperation *downloadOp = [NSBlockOperation blockOperationWithBlock:^{
NSData *imageData = [NSData dataWithContentsOfURL:pictureURL options:0 error:&error];
UIImage *image = [UIImage imageWithData:imageData scale:scale];
dispatch_async(dispatch_get_main_queue(), ^{
pictureHandler(image != nil ? image : defaultPicture);
});
[NetworkActivityIndicator hide];
}];
[self.operationQueue addOperation:downloadOp];
答案 0 :(得分:0)
我对自己在下载Facebook图片时遇到了一些非常模糊的回忆,但不幸的是现在无法回忆起细节。
我正在使用图形api来获取工作正常的缩略图,也许你可以切换到使用类似的,如果它满足你的需要。您应该能够更改?type =以获得与我提取的大小不同的大小。
- (void) fetchFbImageForContact:(MyContact*) targetContact
{
NSString* graphRequest = [NSString stringWithFormat:@"%@%@%@", @"https://graph.facebook.com/",
targetContact.fbid,
@"/picture?type=square"];
FBRequest *fbRequest = [FBRequest requestForGraphPath: graphRequest];
[fbRequest startWithCompletionHandler:
^(FBRequestConnection *connection, id result, NSError *theError)
{
NSDictionary<FBGraphObject> *dict = (NSDictionary<FBGraphObject> *) result;
if (dict)
{
NSString* urlAsString = [dict objectForKey:@"id"];
if ([urlAsString length] > 0)
{
NSURL *url = [NSURL URLWithString: urlAsString];
NSData *data = [NSData dataWithContentsOfURL:url];
targetContact.image = [UIImage imageWithData:data];
}
}
}];
}
答案 1 :(得分:0)
最好也是最简单的方法是使用FBProfilePictureView
从响应中获取用户ID,然后设置属性 profileID