当按钮动作时,如何点赞Facebook页面?

4

我正在尝试从应用程序实现类似页面的功能,我已经添加了最新的Facebook SDK并实现了所有委托和处理程序来检查用户登录到应用程序的会话和状态。 到这里为止一切顺利(示例代码中已经完成了这一步)。 无论如何,我在Facebook开发者网站上找到了以下代码,用于喜欢一个页面,但它似乎不起作用。

- (void) likeFacebookIndia
{
    NSMutableDictionary<FBGraphObject> *action = [FBGraphObject graphObject];
    action[@"object"] = @"http://www.facebook.com/FacebookIndia";
    //action[@"object"] = @"FacebookIndia";
    [FBRequestConnection startForPostWithGraphPath:@"me/og.likes"
                                       graphObject:action
                                 completionHandler:^ (FBRequestConnection *connection,
                                                     id result,
                                                     NSError *error)
     {
         // handle the result
         if(error)
         {
             NSLog(@"%@",error.localizedDescription);
         }
         else
         {
             NSLog(@"%@",result);
         }
     }];
}

成功登录后,我曾调用上述函数,但在likeFacebookIndia模块中出现以下错误:

操作无法完成。(com.facebook.sdk error 5.)

我的问题是:
  1. 我不确定这是否是喜欢页面的正确方法?

  2. 如果正确,那么我真正缺少的是什么?

  3. 还有其他方法吗?

我已经查看了FacebookLikeViewFBLikeButton页面,也有很多问题已经在这里提问,但没有一个似乎适用于最新的Facebook SDK更新。
我能够使用FacebookLikeView来点赞,但有许多问题:
  1. 点赞后会显示UIKeyBoard
  2. 如果需要登录,则加载Facebook页面需要时间
  3. 第二次对同一页面进行点赞后,点赞视图消失!
更新 我在Graph API Explorer上测试了相同的内容,并得到以下结果:

Graph API Explorer

{ "error": { "message": "(#100) Like actions are not yet supported against objects of this type.", "type": "OAuthException", "code": 100 } }

更新2 我已经破解了FacebookLikeView类并解决了上述问题,但它现在不起作用,因为它正在使用过时的FBConnect,而且我有最新的Facebook SDK用于其他工作,这些工作正常运行!如果有人能够使用最新的SDK为FacebookLikeView创建新项目,那会很好。 [我已经在努力了!]
这就是我的做法。
//Calling this function in `viewDidLoad`

- (void) addLikeView
{
    facebookLikeView.delegate = self;
    facebookLikeView.href = [NSURL URLWithString:@"http://www.facebook.com/FacebookIndia"];
    facebookLikeView.layout = @"button_count";
    facebookLikeView.showFaces = NO;
    facebookLikeView.alpha = 0;
    [facebookLikeView load];
}

#pragma mark - Facebook Delegate
-(void)sessionDoneForPageShare:(FBSession *)session state:(FBSessionState)state error:(NSError *)error
{        
    if(error)
    {
        NSLog(@"error : %@",error);
    }
    else
    {
        [facebookLikeView load]; //In logged in or logged out, we've to call this
    }
}

- (void)facebookViewControllerCancelWasPressed:(id)sender
{
    NSLog(@"Login was cancelled by user");
}

- (void)facebookViewControllerDoneWasPressed:(id)sender
{
    NSLog(@"User tapped done button on login view");
}

- (void) checkFBloggedInStatus
{
    if (!FBSession.activeSession.isOpen)
    {
        NSArray *permissions = [NSArray array];
        [FBSession openActiveSessionWithPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceOnlyMe allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error){
            [self sessionDoneForPageShare:session state:status error:error];}
         ];
    }
}

#pragma mark FacebookLikeViewDelegate methods
- (void)facebookLikeViewRequiresLogin:(FacebookLikeView *)aFacebookLikeView {
    [self checkFBloggedInStatus];
}

- (void)facebookLikeViewDidRender:(FacebookLikeView *)aFacebookLikeView {
    [UIView beginAnimations:@"" context:nil];
    [UIView setAnimationDelay:0.5];
    facebookLikeView.alpha = 1;
    [UIView commitAnimations];
}

- (void)facebookLikeViewDidLike:(FacebookLikeView *)aFacebookLikeView {
    NSLog(@"liked");
}

- (void)facebookLikeViewDidUnlike:(FacebookLikeView *)aFacebookLikeView {
    NSLog(@"unliked");
}

- (void)facebookLikeView:(FacebookLikeView *)aFacebookLikeView didFailLoadWithError:(NSError *)error
{
    NSLog(@"FacebookLikeView error: %@",error);
}

通过这样的操作,我可以看到点赞按钮,能够成功登录浏览器,但是接下来什么也没有发生!每次都只会展示点赞按钮! 在旧版SDK“FBConnect”中该功能非常好用,问题出在最新版本的Facebook SDK上。 你可以从这里找到“FacebookLikeView”。 我还需要添加些什么呢?
2个回答

4

重大更新!

如果您看到这条消息,那么现在您无需对您的应用程序进行任何补丁(或黑客攻击),就可以支持 Facebook 页面或任何 Open Graph 对象。最新版的 Facebook iOS SDK(FacebookSDK.framework)已经支持点赞按钮,不过截至我撰写此更新时,它还处于测试版阶段,不过我们已经拥有了长期以来希望拥有的功能,感谢 Facebook。

这里是变更日志和点赞按钮的直接链接,还有相关文档。

解决方案: [推荐]

点赞按钮可用于点赞 Facebook 页面或任何 Open Graph 对象,并且可以通过 URL 或 ID 引用。代码如下:

FBLikeControl *like = [[FBLikeControl alloc] init];
like.objectID = @"http://shareitexampleapp.parseapp.com/photo1/";
[self addSubview:like];

enter image description here

(来源:文档).


老派的方法 [不建议使用]

最终,我解决了我的问题,我将解决步骤放在这里,这对于正在寻找此类内容的人非常有帮助。

以下是您可能需要知道的一些事情(来自我的问题)

  • 我同时在应用程序中使用FBConnect和Facebook SDK。
  • 两者都很好用,FBConnect仅适用于FacebookLikeView - 您需要将FBRequest类替换为其他名称,以便它不会与最新的SDK发生冲突。
  • 仍然需要一些简单快速的解决方案,因为这不是完美的解决方案。

所以我们开始吧,

如何知道用户是否喜欢此特定页面?

您需要使用Graph API并检查用户的喜好。这是一个例子。

https://graph.facebook.com/{USER_ID}/likes/{PAGE_ID}

如果用户喜欢所浏览的页面,系统将返回一个JSON格式的数据,例如下面这样的数据。
{
  "data": [
    {
      "name": "SomeCafe", 
      "category": "Restaurant/cafe", 
      "id": "someIdWillCome", 
      "created_time": "2013-05-07T12:32:00+0000"
    }
  ], 
  "paging": {
    "next": "https://graph.facebook.com/me/likes/someIdWillCome?format=json&limit=5000&offset=5000&__after_id=someIdWillCome"
  }
}

如果用户不喜欢这个页面,就像这样:

{
  "data": [
  ]
}

以下是有关用户点赞的文档: https://developers.facebook.com/docs/reference/api/user/#likes 实现步骤: 1)按照文档中给出的实现FacebookLikeView。 2)我需要实现一个HTTP请求来调用上述URL以检查该页面的当前状态,因为我从FacebookLikeView中不能获取它。请注意,您需要使用access_token进行GET请求。 3)检查响应(接近上面的示例),并根据需要执行操作!
就这样!
以下是我遇到的FacebookLikeView问题的解决方案
1)FacebookLikeView不见了?
是因为一个评论弹出框将其隐藏了! 解决方法如下:
在FacebookLikeView.m类中查找,- (void)didObserveFacebookEvent:(NSString *)fbEvent,并在末尾添加以下行。
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0f)
{
    //NS_AVAILABLE_IOS(5_0);
    [[_webView scrollView] setContentOffset: CGPointMake (0, 0)];
}

2) FacebookLikeView会显示UIKeyboard!!

这是因为在点赞页面后,评论文本框会获得焦点。下面是解决方法。

- (void) keyboardWasShown:(NSNotification *)notification
{
    //force hide UIKeyBoard
    [self.view endEditing:YES];
}

在您实现的类中的viewDidLoad方法中添加通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardWillShowNotification object:nil];

这将取消特定视图中可见的所有键盘,我没有 UITextField ,但我需要Facebook Like按钮,所以如果您的情况有所不同,请确保注意此点。

3)加载缓慢的问题取决于许多因素,如Facebook服务器、互联网连接或其他原因,因此我在其中添加了一个加载指示器——它需要一些时间,但按照我的要求工作!


这将允许我喜欢/取消喜欢Facebook页面,我还能够知道该特定用户的当前状态,因此我可以决定该做什么!

最后,感谢每个检查此问题并回应我的人!感激不尽!:)


1
抱歉告诉你一个坏消息,你不能代表用户点赞页面。你可以代表用户点赞帖子、评论和照片,但不能点赞页面(你提到的 likeview 做的是同样的事情)。如果你尝试做后者,你将收到一个错误信息:
"message": "(#3) Application does not have the capability to make this API call."
但好消息是,你可以使用 iFrame,在 UIWebView 中加载它。目前这是在本地应用中集成页面点赞按钮的唯一解决方案。如果想进一步了解,可以查看这个资源:http://www.raywenderlich.com/1626/how-to-post-to-a-users-wall-upload-photos-and-add-a-like-button-from-your-iphone-app。在那里你可以找到一个章节:
添加 Facebook 粉丝页的点赞按钮
希望这能帮到你。

他已经实现了那个部分,你分享的信息对于那些使用iOS + Facebook的人来说并不新鲜。为了保持登录/会话与已登录用户的同步,必须切换回WebView登录。而将会话等保存在cookie中只能帮助某些人在iFrame(在Webview中)中点赞,但如果用户没有使用旧版SDK(已过时),则必须要求用户在Safari或Webview中登录,这意味着同一用户需要进行两次登录:一次是原生应用程序登录,另一次是Webview登录,如果您想通过iFrame玩转页面喜欢。 - Reno Jones
如果这个问题已经被许多开发者所知,那为什么还要进行这样的讨论呢?如果显而易见,那为什么这个人还要发布这个问题呢? - Yervand Khalapyan
是的,如果我在我的问题上开始悬赏,那就意味着我已经尽力让它工作了,无论如何感谢你的回答。我发布这个问题是为了得到完美的解决方案(我有一种感觉,“一个Facebook开发者会检查它并发布答案!”),因为它与众多开发者社区息息相关。让我们等待并观察! - Hemang
大约1.5年后,他们听到了@YervandKhalapyan!他们添加了喜欢按钮。xoxo:D;) - Hemang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接