删除或更改缓存的Open Graph对象

时间:2012-11-06 14:01:21

标签: facebook facebook-graph-api

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

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

我现在修复了这个错误 - 我在对象调试工具中对它进行了验证,并且我也可以看到它已修复为我在我的应用中执行操作的新对象。

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

我设法使用Graph API资源管理器找到有问题的对象的ID,但没有删除它的好运(得到"(#3) App must be on whitelist"例外)。

我怎么能以某种方式强迫对象重新创建?

编辑:

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

编辑:

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

3 个答案:

答案 0 :(得分:2)

使用调试器强制Facebook重新调整URL,以便破坏缓存。您还可以通过添加'scrape = true'作为参数来以编程方式强制重新扫描。有点像...

POST https://graph.facebook.com

id=http://mysite.com/myobject
&
scrape=true&access_token=234876AB6865...

看看是否有帮助

答案 1 :(得分:1)

根据this answer中有关类似问题的建议,我终于想出如果我更改我的iOS应用的代码,则设置FBGraphObject的网址包含:& fbrefresh = CAN_BE_ANYTHING,新发布的操作将与更新的对象一起发布。

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

答案 2 :(得分:0)

首先,您应该在网页上获得有关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);
    }];
}