就像按钮动作上的Facebook页面一样

时间:2013-04-25 12:30:36

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

我正在尝试从应用程序实现页面功能,我添加了最新的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. 还有其他办法吗?

  4. 我已经访问了FacebookLikeViewFBLikeButton的网页,这里也提到了许多问题,但似乎没有一个问题适用于最新的Facebook SDK更新。 我能够喜欢FacebookLikeView的页面,但是有很多问题,

    1. UIKeyBoard像页面一样显示
    2. 如果需要登录并
    3. ,请加载Facebook页面
    4. 第二次喜欢到同一页面,就像视图在某个地方出去一样!
    5. 更新 我在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用于其他工作得很好的东西! 如果有人用FacebookLikeView的最新SDK制作新项目会很好。 [我已经在工作了!]

      这就是我的工作方式,

      //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, 你可以找到FacebookLikeView here

      我缺少什么?

2 个答案:

答案 0 :(得分:4)

大更新!

如果您看到这意味着,现在您不需要在应用程序中修补(或破解)任何支持(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];

enter image description here

(来源: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在某个地方离开了?

因为评论popover隐藏了它!以下是解决方案

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 :(得分:1)

很抱歉告诉您坏消息,但您不能代表用户代表网页。您可以代表用户而不是页面来浏览帖子,评论和照片(您提到的类似视图也是如此)。如果您尝试执行后者,则会收到错误

  

&#34; message&#34;:&#34;(#3)应用程序无法生成   这个API调用。&#34;

但好消息是你可以通过使用将在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粉丝页面添加赞按钮

希望这会对你有所帮助。

相关问题