【问题标题】:Like Facebook page on button action喜欢按钮操作的 Facebook 页面
【发布时间】:2013-04-19 08:28:07
【问题描述】:

我正在尝试从应用程序实现类似页面的功能,我添加了最新的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 错误 5。)

在这里,我的问题是,

  1. 我不确定这是否是点赞页面的正确方式?

  2. 如果它是正确的,那么我真正错过了什么?

  3. 还有其他办法吗?

我已经访问了FacebookLikeViewFBLikeButton 的页面,这里也已经提出了许多问题,但似乎没有一个问题适用于最新的Facebook SDK 更新。 我可以用FacebookLikeView 点赞一个页面,但这样做有很多问题,

  1. 一个UIKeyBoard 在赞页面后出现
  2. 如果需要登录,请花时间加载 Facebook 页面,并且
  3. 第二次点赞到同一页面后,点赞视图消失在某处!

更新 我在 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 for 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);
}

有了这个,我可以看到点赞按钮,可以登录到浏览器,但是什么都不会发生!每次都会显示 Like 按钮!

这在旧 SDK FBConnect 上运行良好,问题出在最新的 Facebook SDK 上, 你可以找到FacebookLikeViewhere

我错过了什么?

【问题讨论】:

    标签: ios iphone facebook facebook-like facebook-page


    【解决方案1】:

    大更新!

    如果您看到这意味着,现在您无需在应用程序中修补(或破解)任何支持(如 Facebook 上的页面或任何 Open Graph 对象)的东西。随着 Facebook iOS SDK (FacebookSDK.framework) 的最新版本,它们支持类似按钮,但是(在我编写此更新时)它位于 beta,但我们有一些我们长期以来一直希望的东西, 谢谢 Facebook

    这是更改日志和点赞按钮的直接链接,也是文档。

    解决方案: [推荐]

    Like 按钮可用于为 Facebook 页面或任何 Open Graph 点赞 对象,可以通过 URL 或 ID 引用。这是代码的样子 喜欢:

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

    (来源:Documentation)。


    老派的方式 [不推荐]

    最后,我能够解决我的问题,我正在制定解决步骤,以便对正在寻找这类东西的人非常有帮助,

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

    • 我在我的应用中同时使用 FBConnect 和 Facebook SDK。
    • 两者都工作正常,FBConnect 仅适用于FacebookLikeView -- 您需要将 FBRequest 类替换为其他名称到 FBConnect 中,以免与最新的 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 页面,我还能够知道该特定用户的当前状态,以便我可以决定做什么!

    最后,感谢所有检查此问题并回复我的人!赞赏! :)

    【讨论】:

      【解决方案2】:

      很抱歉告诉您坏消息,但您不能代表用户点赞主页。您可以代表用户点赞帖子、cmets 和照片,但不能代表页面点赞(您提到的点赞视图也是如此)。如果你尝试做后者,你会收到一个错误

      "message": "(#3) 应用程序没有能力使 这个 API 调用。”

      但好消息是您可以使用将加载到 UIWebView 中的 iFrame 来实现。目前,这是在原生应用程序中集成 PAGE 类按钮的唯一解决方案。如需进一步阅读,您可以查看此资源: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 中,这意味着同一用户的两次登录:一个来自 Native 应用程序,一个用于 Webview,如果你想玩的话通过 iFrame 获得 Pages Likes。
      • 如果在这种情况下许多开发人员都知道为什么要进行此讨论。如果这比这个人发布这个问题的原因很明显?
      • 是的,如果我开始对我的问题给予赏金,这意味着我已经尽了最大努力让这个工作正常进行,无论如何感谢您的回答。发布这个问题是为了获得完美的解决方案(我感觉,“Facebook 开发人员会检查它并发布答案!”),因为它高度关注庞大的开发人员社区。让我们拭目以待!
      • 几乎在 1.5 年后,他们听到了@YervandKhalapyan!他们添加了喜欢按钮。 xoxo :D ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多