Facebook的图片帖最终出错了

mah*_*udz 9 iphone facebook facebook-graph-api ios

我试图将图片发布到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]; 
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误消息.除了照片最终出现在我自己的专辑,我/照片,而不是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]; 
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   @"access_token",  @"fields",
                                   nil];
    FBRequest *request = [facebook requestWithGraphPath:@"226338660793052" andParams:params andDelegate:self];
Run Code Online (Sandbox Code Playgroud)

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

    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];
Run Code Online (Sandbox Code Playgroud)

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

  if ([self isSessionValid]) {
        [params setValue:self.accessToken forKey:@"access_token"];
  }
Run Code Online (Sandbox Code Playgroud)

至:

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

这使得您指定的访问代码成为params的一部分,而不受Facebook.accessToken的破坏.现在,这将把图片发布到我感兴趣的页面.

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

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

注意:

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

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

页面访问令牌

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

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

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

Con*_*acy 0

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