草庐IT

ios - 像按钮操作上的 Facebook 页面

coder 2023-09-27 原文

我正在尝试从应用程序中实现类似页面的功能,我添加了最新的 Facebook SDK 并实现了所有委托(delegate)和处理程序来检查用户登录应用程序的 session 和状态。到这里它工作正常(这已经在示例代码中完成)。无论如何,我从 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 block 中出现以下错误,

The operation couldn’t be completed. (com.facebook.sdk error 5.)

在这里,我的问题是,

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

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

  3. 还有其他办法吗?

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

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

更新 我在 Graph API Explorer 上测试了同样的东西,结果如下,

{ “错误”: { "message": "(#100) 此类对象尚不支持点赞操作。", “类型”:“OAuthException”, “代码”: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);
}

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

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

我错过了什么?

最佳答案

重大更新!

如果您看到这意味着,现在您不需要修补(或破解)任何东西来支持您的应用程序(Facebook 上的页面或任何 Open Graph 对象)。随着 Facebook iOS SDK (FacebookSDK.framework) 的最新版本,他们支持点赞按钮,但是(在我编写此更新时)它处于 beta 阶段,但我们有一些我们希望的东西很久以来,感谢 Facebook

这里是更改日志和喜欢按钮的直接链接,也是文档。

解决方案: [推荐]

The Like button can be used to like a Facebook Page or any Open Graph object and can be referenced by URL or ID. Here's what the code looks like:

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

(来源:Documentation)。


老派方式 [不推荐]

终于,我能够解决我的问题了,我正在制定解决步骤,这对正在寻找这类东西的人来说真的很有帮助,

一些你可能需要知道的事情(来 self 的问题)

  • 我在我的应用中同时使用 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 消失了?

这是因为评论弹窗 Conceal 了它!下面是解决方案

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];

This will resign all keyboard visible from that particular view, in my case I'd no UITextField where I need the Facebook Like Button, so if your case is difference then make sure with this point.

3) 缓慢加载 问题取决于 Facebook 服务器、互联网连接或其他东西的许多因素,所以我在其中添加了一个加载指示器 -- 它需要一些时间,但可以正常工作我要!


This will allow me like / unlike a Facebook page also I am able to know the current status of that particular user so I can decide what to do!

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

关于ios - 像按钮操作上的 Facebook 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16214839/

有关ios - 像按钮操作上的 Facebook 页面的更多相关文章

  1. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  2. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  3. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  9. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  10. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

随机推荐