【问题标题】:Deleting or changing a cached Open Graph object删除或更改缓存的 Open Graph 对象
【发布时间】:2012-11-06 14:01:20
【问题描述】:

我正在使用最新的 Facebook iOS SDK 向 Open Graph 发布操作。

现在,在我的服务器端,我在创建对象时遇到了一个错误,影响了对象的标题。

我现在修复了这个错误 - 我在 Object Debugger 工具中对其进行了验证,而且我可以看到它已针对我在我的应用程序中执行操作的新对象进行了修复。

但是,当我在其上发布新操作时,我最初在从我的应用发布操作时创建的对象仍然具有格式错误的标题。

我设法使用 Graph API Explorer 找到了有问题的对象的 ID,但没有成功删除它(遇到 "(#3) App must be on whitelist" 异常)。

有什么办法可以强制重新创建对象吗?

编辑:

我已经尝试了James's answerthis answer 中针对类似问题建议的两种方法,但无法刷新我对格式错误的对象的现有和新发布的操作。调试器似乎确实创建了一个具有固定数据的抓取对象,但它不会更新原始对象,而是给我一个新对象(我可以在 URL 部分的“Graph API:”URL 中看到一个新 ID对象调试器的底部。

编辑:

我终于找到了适用于新操作(不是现有操作)的解决方案。请参阅下面的answer

【问题讨论】:

    标签: facebook facebook-graph-api


    【解决方案1】:

    使用调试器会强制 Facebook 重新抓取 URL,因此应该会破坏缓存。您还可以通过添加 'scrape=true' 作为参数以编程方式强制重新刮擦。有点像...

    POST https://graph.facebook.com
    
    id=http://mysite.com/myobject
&
scrape=true&access_token=234876AB6865...
    

    看看有没有帮助

    【讨论】:

    • 它似乎确实抓取了对象,但它不会更改动作指向的现有 ID,而是创建一个新 ID。此对象的现有操作以及我的应用程序中的新操作仍指向旧的格式错误的对象...
    【解决方案2】:

    按照this answer 中针对类似问题的建议,我终于发现如果我更改我的 iOS 应用程序的代码以设置 FBGraphObject 的 URL 以包含:&fbrefresh=CAN_BE_ANYTHING,新发布的操作与更新的对象一起发布。

    这仍然不能修复现有操作(它们仍然指向格式错误的对象),但至少这样我可以确保新发布的操作指向刷新的对象。

    【讨论】:

      【解决方案3】:

      首先,您的网页上应该有关于 OpenGraph 的信息。 Facebook 会缓存每个 URL 的元信息。 如果您共享相同的 URL,Facebook 将使用它已经缓存的信息,即使它已被修改。 因此,您应该显式更新 URL 的缓存信息。 如果您使用的是Objective-C,可以使用以下代码更新缓存信息。

      iOS,Objective-C

      - (void)viewDidLoad {
          [super viewDidLoad];
          // Do any additional setup after loading the view, typically from a nib.
      
          //Example..
          NSString *targetId = @"{The URL for update}";
          [self updateFacebookCache:targetId];
      }
      
      - (void)updateFacebookCache:(NSString *)targetId {
          NSString *url = @"https://graph.facebook.com";
      
          NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
          [params setObject:targetId forKey:@"id"];
          [params setObject:@"true" forKey:@"scrape"];
      
          AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
          manager.requestSerializer = [AFJSONRequestSerializer serializer];
          [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
      
          [manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
              NSLog(@"success!");
          } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
              NSLog(@"error: %@", error);
          }];
      }
      

      【讨论】:

        猜你喜欢
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多