Three20 和 Facebook Graph API 问题

Posted

技术标签:

【中文标题】Three20 和 Facebook Graph API 问题【英文标题】:Three20 and Facebook Graph API Problem 【发布时间】:2011-03-10 21:09:27 【问题描述】:

我正在尝试将 Three20 Facebook 示例应用与 Facebook Graph API 一起使用(进行身份验证并获取访问令牌)。我正在为 TTURLRequest 使用以下代码:

- (void)load:(TTURLRequestCachePolicy)cachePolicy more:(BOOL)more 
  if (!self.isLoading && TTIsStringWithAnyText(_query)) 
    NSString* url = _query;
    NSLog(@"load:%@:", url);

    TTURLRequest* request = [TTURLRequest requestWithURL:url delegate:self];

    request.cachePolicy = cachePolicy | TTURLRequestCachePolicyEtag;
    request.cacheExpirationAge = TT_CACHE_EXPIRATION_AGE_NEVER;

    TTURLJSONResponse* response = [[TTURLJSONResponse alloc] init];
    request.response = response;
    TT_RELEASE_SAFELY(response);

    [request send];
  

这对于没有访问令牌(即https://graph.facebook.com/markzuckerberg/feed)的 url 非常有效,但是每当我在完全相同的页面上使用访问令牌(即https://graph.facebook.com/markzuckerberg/feed?access_token=...)时,我都会收到描述“错误 url”的错误。将任一 URL 复制到 Web 浏览器表明两者都可以正常工作,但 URL 请求只会为带有 access_token 的那个生成错误。

我能想到的唯一可能的解释是 TTURLRequest 对 URL 的长度有限制。有谁知道为什么会发生这种情况和/或有任何解决方法?


更新:这就是我构建 URL 的方式:

self.accessToken = [_facebook.accessToken stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
self.dataSource = [[[TTFacebookNewsFeedDataSource alloc] initWithQuery:[NSString stringWithFormat:@"http://graph.facebook.com/markzuckerberg/feed?access_token=%@", self.accessToken]] autorelease];

【问题讨论】:

【参考方案1】:

我使用 FBRequest serializeURL 解决了这个问题:

AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString* url = [FBRequest serializeURL:@"https://graph.facebook.com/me/home" params:[NSMutableDictionary dictionaryWithObject:appDel.facebook.accessToken forKey:@"access_token"]];

【讨论】:

【参考方案2】:

检查您的网址的语法。我假设您没有正确转义您的 get 参数,例如访问令牌和/或其他参数。

【讨论】:

在将访问令牌添加到 url 之前,我使用以下代码对其进行转义:[_facebook.accessToken stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]。访问令牌是唯一的参数。我在请求之前对 URL 进行 NSLog,如果我将 NSLogged URL 复制到浏览器,则 JSON 加载正常,所以我不认为这是一个转义问题。 self.accessToken = [_facebook.accessToken stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; self.dataSource = [[[TTFacebookNewsFeedDataSource alloc] initWithQuery:[NSString stringWithFormat:@"graph.facebook.com/markzuckerberg/feed?access_token=%@", self.accessToken]] autorelease]; 评论中的格式搞砸了,所以我将其添加到问题中

以上是关于Three20 和 Facebook Graph API 问题的主要内容,如果未能解决你的问题,请参考以下文章

Facebook Graph API Explorer 未列出其他人上传的已标记照片

如何使用 Facebook Graph API 获取群组视频列表?

如何通过 facebook graph api 获取***故事讲述者用户 ID

UIViewController解耦---浅析Three20架构

动态生成 Facebook Open Graph 元标记

在 Facebook Graph Explorer 中为测试用户创建测试页面