我在iOS上遇到图API的一些问题。 我正在尝试从用户那里获取所有FB专辑。我注意到默认情况下,图形API会回答25个第一个元素,然后它们会提供下一个和/或前一个网址来查询其余的元素。
我的问题是我需要一次性查询每个元素(不仅是前25个)。
我尝试使用Facebook文档中解释的limit参数,但我得到一个空数据数组作为响应。当我删除限制参数时,我可以抓住25个第一个元素。 当我尝试使用直到=今天或直到=昨天时,Facebook API的行为方式类似。
以下是我使用的网址:
https://graph.facebook.com/me/albums?limit=0
0应该意味着没有限制,我尝试了99999相同的结果。
我想知道某人是否已经从图谱API中获得了这种奇怪的行为?
感谢您的帮助!
答案 0 :(得分:0)
我终于找到了问题。
社交网络中存在一个错误,即苹果总是在网址字符串的末尾附加字符串"?access_token=[ACCESS_TOKEN]"
。
根据这一点,如果您在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];
}
首先,我测试字符串中是否存在param字符,然后添加正确的字符。 我以处理错误的方式给你奖励。
我仍然使用社交框架获取凭据并连接用户:
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类中构建的异步方法。
希望这会对某人有所帮助!