0

我在使用 iOS 上的图形 API 时遇到了一些问题。我正在尝试从用户那里获取所有 FB 专辑。我注意到,默认情况下,图形 API 回答 25 个第一个元素,然后它们提供下一个和/或上一个 url 来查询其余的。

我的问题是我需要一次查询每个元素(不仅是前 25 个)。

我尝试使用 Facebook 文档中解释的 limit 参数,但我得到一个空数据数组作为响应。当我删除限制参数时,我可以获取 25 个第一个元素。当我尝试使用 until=today 或 until=yesterday 时,Facebook API 的行为方式类似。

这是我正在使用的网址: https://graph.facebook.com/me/albums?limit=0 0 应该意味着没有限制,我尝试了 99999 相同的结果。

我想知道是否有人已经从 Graph API 中获得了这种奇怪的行为?

谢谢您的帮助!

4

1 回答 1

0

我终于找到了问题所在。

社交网络中存在一个错误,它表明 Apple 总是将字符串附加"?access_token=[ACCESS_TOKEN]"到 url 字符串的末尾。

据此,如果您在 URL 字符串之前放置一个参数,则该 URL 无效,因为您将有两个“?” 在字符串中。

为避免这种情况,我使用 NSURLConnection 类以这种方式管理连接:

NSString *appendChar = [[url absoluteString] rangeOfString:@"?"].location == NSNotFound ? @"?" : @"&";
NSString *finalURL = [[url absoluteString] stringByAppendingFormat:@"%@access_token=%@", appendChar, self.facebookAccount.credential.oauthToken];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:finalURL]];
NSURLResponse *response;
NSError *error;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

if (error)
    [self.delegate facebookConnection:self didFailWithError:error];
else
{
    NSError *jsonError;
    NSDictionary *resultDictionnary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];

    if (jsonError)
        [self.delegate facebookConnection:self didFailWithError:jsonError];
    else if ([resultDictionnary valueForKey:@"error"])
    {
        NSDictionary *errorDictionary = [resultDictionnary valueForKey:@"error"];
        NSError *facebookError = [NSError errorWithDomain:[errorDictionary valueForKey:@"message"] code:[[errorDictionary valueForKey:@"code"] integerValue] userInfo:nil];
        [self.delegate facebookConnection:self didFailWithError:facebookError];
    }
    else
        [self.delegate facebookConnection:self didFinishWithDictionary:resultDictionnary httpUrlResponse:response];
}

首先,我测试字符串中是否存在参数字符并附加正确的字符。我以我处理错误的方式给你作为奖励。

我仍然使用社交框架来获取凭据并连接用户:

    NSDictionary *accessParams = @{ACFacebookAppIdKey:kFacebookAppID, ACFacebookPermissionsKey:@[@"email", @"user_photos", @"user_activities", @"friends_photos"]};
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

[accountStore requestAccessToAccountsWithType:accountType options:accessParams completion:^(BOOL granted, NSError *error)
 {
     if (granted)
     {
         NSArray *facebookAccounts = [accountStore accountsWithAccountType:accountType];

         if ([facebookAccounts count] > 0)
         {
             self.facebookAccount = [facebookAccounts objectAtIndex:0];
             self.accessToken = self.facebookAccount.credential.oauthToken;
             [self.delegate facebookConnectionAccountHasBeenSettedUp:self];
         }
     }
     else
        [self.delegate facebookConnection:self didFailWithError:error];
 }];

在此代码中,我不处理多个 facebook 帐户,但您可以轻松地转换该代码段以用您自己的方式处理它。此外,连接是同步发送的,因为我使用 GCD 来避免阻塞我的界面,但是您可以实现内置在 NSURLConnection 类中的异步方法。

希望这会对某人有所帮助!

于 2012-11-23T09:51:18.410 回答