4

我正在为 iOS 创建一个照片应用程序。我有一个自定义动作类型对,在我的应用程序中定义了“拍照”。我首先创建“照片”对象(我有一个用户生成的图像,我首先上传照片并获取暂存 URI。此代码在此之后):

NSMutableDictionary *imageData = [NSMutableDictionary dictionaryWithDictionary:
                                          @{
                                          @"url" : stagingURL,
                                          @"user_generated" : @"true",

                                          }];
NSMutableDictionary<FBOpenGraphObject> *object =
        [FBGraphObject openGraphObjectForPostWithType:@"tonerapp:photo"
                                                title:@"photo"
                                                image:imageData
                                                  url:@"http://tonerapp.info"
                                          description:title];
//post the object to facebook
[FBRequestConnection startForPostOpenGraphObject:object completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
            if(result != nil){
                NSString* resultID = [result objectForKey:@"id"];
                NSMutableDictionary<FBGraphObject> *actionDict = [FBGraphObject graphObject];
                actionDict[@"photo"] = resultID;
                [self postTakeActionToFacebookWithOpenGraphObject:actionDict completion:action];

            }else{
                action(NO);
            }
        }];

发布对象后,我在完成处理程序中发布“采取”操作,如上所示。以下是使用“photo”对象发布“take”操作的代码:

-(void)postTakeActionToFacebookWithOpenGraphObject:(NSMutableDictionary<FBGraphObject>*)ogObject completion:(booleanAction)action{
  if(self.selectedPlace != nil){
      ogObject[@"place"] = [self.selectedPlace id];
  }
  if(self.taggedFriends != nil && self.taggedFriends.count > 0){
      ogObject[@"tags"] = self.taggedFriends;
  }
  [FBRequestConnection startForPostWithGraphPath:@"me/tonerapp:take"
                                   graphObject:ogObject
                             completionHandler:^(FBRequestConnection *connection,
                                                 id result,
                                                 NSError *error) {
                                 if(result != nil){
                                     NSLog(@"oldu");
                                     action(YES);
                                 }else{
                                     action(NO);
                                 }

                             }];
}

结果如下:

发布了两个动作

首先创建“发布”动作,然后将“拍摄”动作应用于照片。我需要摆脱“发布”动作。更奇怪的是,我的 Open Graph 仪表板看起来像这样:

自动添加的默认操作

我删除了“对象”类型和“发布”动作,但每隔一次,它们就会再次添加到我的动作中。我怀疑我做错的事情会导致“默认帖子创建操作”问题和默认对被添加到我的仪表板。我转到我的应用程序的设置并更改我的照片类型的订阅(创建)操作:

创作动作设定

然后我尝试再次发布我的照片。即使我的创建操作是“采取”,也会创建一个“发布”操作:

事后行动

但这次我无法创建任何“采取”行动。它因以下响应而失败:

body =     {
    error =         {
        code = 1611231;
        message = "A post action for this object already exists.";
        type = Exception;
    };
};
code = 500;

这不应该正好相反吗?如果我不将默认创建操作设置为自定义操作,我不应该把它搞砸吗?我还尝试过“即时”创建照片对象(没有先“发布”它并直接在“拍摄”操作中发送对象 JSON 数据,这似乎是这样做的自然方式),但它也会失败,就像在这个例子中一样:Example Facebook object code。. 我是否遗漏了什么,或者 Open Graph API 是否存在严重问题?

谢谢,

能。

更新:我启用了 2013 年 7 月的迁移。

4

2 回答 2

6

如果您通过对象 API(这是您与 startForPostOpenGraphObject 一起使用的,也通过共享对话框)创建(用户拥有的)开放图形对象,那么将创建一个“发布”操作。解决它的唯一方法是托管您自己的开放图形对象。

这样想,你真正在做的实际上是 2 个独立的操作。

  1. 您创建了一个开放的图形对象(即您“发布”了一个对象)
  2. 您创建一个作用于对象的开放图形操作(即您的“采取”操作)

它们中的每一个都会在活动日志中产生一个单独的活动。这种分离很重要,因为您可以在不同的操作中重用相同的对象,并且它必须显示在用户的活动日志中,因为它是用户拥有的对象。

另请参阅https://developers.facebook.com/docs/opengraph/using-object-api/

于 2013-07-22T23:13:02.813 回答
-1

@can Poyrazoglu

如果您不为每个帖子创建故事,您应该使用这种方法。如果同一个帖子有多个图像,它将对图像进行分组并仅制作整个相册,而不是创建单独的帖子。

NSMutableDictionary* params = [[NSMutableDictionary alloc] init];
[params setObject:@"your custom message" forKey:@"message"];
[params setObject:UIImagePNGRepresentation(_image) forKey:@"picture"];
_shareToFbBtn.enabled = NO; //for not allowing multiple hits

[FBRequestConnection startWithGraphPath:@"me/photos"
                             parameters:params
                             HTTPMethod:@"POST"
                      completionHandler:^(FBRequestConnection *connection,
                                          id result,
                                          NSError *error) 
 {
 if (error) 
 {
     //showing an alert for failure
     [self alertWithTitle:@"Facebook" message:@"Unable to share the photo please try later."];
 } 
 else
 {
     //showing an alert for success
     [UIUtils alertWithTitle:@"Facebook" message:@"Shared the photo successfully"];
 }
 _shareToFbBtn.enabled = YES;
 }];
于 2014-09-03T09:54:33.117 回答