在iPhone上下载用户的FB个人资料图片时出现非常奇怪的问题



我为iPhone开发了该应用程序,并使用Facebook API进行一些社交活动。我必须下载用户的个人资料图片,因此我编写了代码以通过FQL获取其URL并下载。

乍一看似乎一切都很好,我的代码奏效了,但是几天后,我注意到无法下载用户的图片。FBSESSION打开正确的打开,FQL查询执行没有任何错误并返回正确的URL,但是我的应用程序无法获取图像数据( [NSDATA DATAWITHCONTENTSOFURL:]或NSURLCONNECTION在所有情况下始终开始返回NIL数据,并在所有情况下返回NIL数据输出'错误)。因此,我试图从iPhone设备中删除我的应用程序并清洁Facebook数据,但是除了在Facebook开发人员门户网站删除和重新创建我的应用帐户外,没有任何帮助。目前,这种奇怪的情况已经重复:最初,所有功能都按预期工作,但是一段时间后,它开始下载用户的图片。所以我不知道该怎么办。

  • 我还注意到官方的Facebook应用程序以来时刻也无法下载用户个人资料图片。所以我的应用程序和Facebook应用程序现在无法下载用户个人资料图片。
  • 也继续在模拟器上正常工作。问题发生了仅在我的iPhone设备上。
  • 另外,如果我试图下载另一张图片(我已经检查了用户封面图像)一切似乎都可以!

那么,有人可以帮助我解决这个问题吗?预先感谢!

所有代码都在下面。

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];

我对自己有问题下载Facebook图片有一个非常模糊的回忆,但不幸的是现在无法记住细节。

我正在使用图形API获取正常运行的缩略图图片,也许您可以切换到相似的情况下满足您的需求。您应该能够更改?类型=获得与我所拿的不同的大小。

- (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];
             }
         }
     }];
}

最好,最容易的方法是使用fbprofilepictureview

从响应中获取用户ID,然后设置属性 profileId

相关内容

最新更新