Facebook的图片帖最终出错了

时间:2012-02-21 08:08:16

标签: iphone ios facebook facebook-graph-api

我试图将图片发布到ID为226338660793052的Facebook页面,但它一直在/ me / photos中结束。我做错了什么?

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   imageToSend, @"source",
                                   facebookMessageTextView.text, @"message",
                                   nil];
[facebook requestWithGraphPath:@"/226338660793052/photos" andParams:params andHttpMethod:@"POST" andDelegate:self]; 

我没有收到任何错误消息。除了照片最终出现在我自己的专辑,我/照片,而不是在226338660793052 /照片的专辑中,我什么都没得到。

但是,当我只是向该页面发布消息时,我确实在该页面的时间轴上得到了一个成功的帖子:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   @"http://www.bitsonthego.com", @"link",
                                   @"my profile", @"name",
                                   facebookMessageTextView.text, @"message",
                                   nil];
[facebook requestWithGraphPath:@"/226338660793052/feed" andParams:params andHttpMethod:@"POST" andDelegate:self]; 

我在这里缺少什么?我知道这一定是可能的,因为我可以使用浏览器将图片上传到所需的页面,作为一个随机的非管理员用户。我似乎无法从图API中做到这一点。

更新

我已经解决了部分问题。您必须使用目标页面的access_token。这就是你得到它的方式:

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   @"access_token",  @"fields",
                                   nil];
    FBRequest *request = [facebook requestWithGraphPath:@"226338660793052" andParams:params andDelegate:self];

获得结果后,将其添加到上面的交易中:

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   image, @"source",
                                  [result objectForKey:@"access_token"], @"access_token",
                                   facebookMessageTextView.text, @"message",
                                   nil];

    FBRequest *request = [facebook requestWithGraphPath:[[result objectForKey:@"id"] stringByAppendingString:@"/photos"] andParams:params andHttpMethod:@"POST" andDelegate:self];

但是,这不起作用,因为Facebook.m将使用默认用户access_token替换这个新的access_token,所以我在第166行附近更改了Facebook.m,来自:

  if ([self isSessionValid]) {
        [params setValue:self.accessToken forKey:@"access_token"];
  }

为:

  if ([self isSessionValid]) {
    if ([params valueForKey:@"access_token"] == nil)
        [params setValue:self.accessToken forKey:@"access_token"];
  }

保持您指定的访问代码作为参数的一部分,不受Facebook.accessToken的破坏。现在,这将把图片发布到我感兴趣的页面。

然而,这是有效的,因为我是相关页面的管理员。其他用户将无法发布图片,并且图片将再次出现在他们自己的相册中,因为获取该页面的access_token的调用将返回nil。

根据Facebook文档,如果页面不受限制,就像这个页面一样,那么应该可以将图片发布到它:

  

注意:

     

对于需要访问令牌的连接,您可以使用任何有效的连接   如果页面是公共的而不受限制,则访问令牌。连接上   受限制的页面需要用户访问令牌,并且仅对其可见   符合页面上设置的限制条件(例如年龄)的用户。

我是否提到我的网页是公开的而不受限制的?

  

网页访问权限

     

以页面形式执行以下操作,而不是当前操作   用户,您必须使用Page的访问令牌,而不是用户访问令牌   常用于读取Graph API对象。此访问令牌可以是   通过向/ USER_ID /帐户发出HTTP GET来检索   manage_pages权限。这将返回一个页面列表(包括   应用程序profilePages)用户具有管理访问权限,   以及那些页面的access_tokens。或者,你可以得到一个   通过发出HTTP GET来获取单个特定页面的页面访问令牌   to / PAGE_ID?fields = access_token with themanage_pages权限,如   如上所述。发布到页面还需要publish_stream   许可,除非另有说明。

那么如何将图片发布到公共/不受限制的页面?我可以从任何浏览器中执行此操作,因此可以,但是如何使用Graph API完成?鉴于我可以在没有access_token shenanigans的情况下发布到Feed,发布图片会有什么不同?

总之,我要做的是使用图谱API将图片(而不仅仅是缩略图网址)发布到公共/非限制页面。

3 个答案:

答案 0 :(得分:4)

我的问题此刻!我认为问题在于您重写的框架中的线条,因为Facebook SDK现在是无法编辑的静态库,所以这变得不可能。但是,我已经弄清楚如何创建照片帖子而不用更改SDK - 我使用从应用程序获取的令牌字符串创建新的令牌数据:

FBAccessTokenData *tokenData = [FBAccessTokenData createTokenFromString:tokenString permissions:[FBSession activeSession].accessTokenData.permissions expirationDate:[FBSession activeSession].accessTokenData.expirationDate loginType:FBSessionLoginTypeFacebookApplication refreshDate:nil];

然后我使用fb appID创建新的FBSession(和nullCacheInstance,不知何故,它似​​乎很重要):

FBSession *sessionFb = [[FBSession alloc] initWithAppID:appID permissions:[NSArray arrayWithObjects: @"publish_stream", @"manage_pages", nil] urlSchemeSuffix:nil tokenCacheStrategy:[FBSessionTokenCachingStrategy nullCacheInstance]];

然后我用创建的tokenData打开新创建的会话,将此新会话设置为活动会话,并且它可以正常工作!

[sessionFb openFromAccessTokenData:tokenData completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
 {
 }];

[FBSession setActiveSession:sessionFb];

然后调用带有Post参数和源图像的PageAppID /照片请求,并在Facebook页面墙上发布图片来自自己!

[FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"%@/photos", PageAppID] parameters:params HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
 }];

我认为更改activeSession与改变Facebook中的行类似。

希望今天有人帮助

答案 1 :(得分:0)

尝试发布到PAGE /帖子而不是PAGE /照片,并在帖子中添加图片属性。照片连接适用于页面管理员创建的照片。有关帖子连接的完整属性列表,请参阅https://developers.facebook.com/docs/reference/api/page/#posts

答案 2 :(得分:0)

很抱歉,如果我错误地理解了您的问题。您无法直接发布到墙上。在facebook API中没有方法可以实现这一点。请查看此链接。

https://developers.facebook.com/docs/reference/api/

以下截图来自该链接。 enter image description here