【问题标题】:Facebook Graph API GET request - Should contain "fields" parameter (Swift, Facebook SDK v4.5.1)Facebook Graph API GET 请求 - 应包含“字段”参数(Swift,Facebook SDK v4.5.1)
【发布时间】:2015-11-08 23:39:21
【问题描述】:

我的 iOS 应用在注册期间使用 Facebook 的 Graph API 请求来获取用户信息,这在升级到 Facebook 的最新 SDK 之前运行良好。升级后,我收到运行时错误消息:“FBSDKLog:从 Graph API v2.4 开始,对 /me 的 GET 请求应包含明确的“字段”参数”。

代码如下:

func requestFacebook() {

    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in

        if ((error) != nil)
        {
            // Process error
            println("Error: \(error)")
        }
        else if error == nil
        {
            let birthday : NSString = (result.valueForKey("birthday") as? NSString)!

            var currentDate = NSDate()
            var birthdayFormatter = NSDateFormatter()
            let userCalendar = NSCalendar.currentCalendar()
            birthdayFormatter.dateFormat = "MM/DD/YYYY"
            var birthdayNSDate = birthdayFormatter.dateFromString(birthday as String)

            var userAge = self.calculateAge(birthdayNSDate!)

            PFUser.currentUser()!["age"] = userAge

            var facebookID: NSString = (result.valueForKey("id") as? NSString)!
            var pictureURL = "https://graph.facebook.com/\(facebookID)/picture?type=large&return_ssl_resources=1"

            var URLRequest = NSURL(string: pictureURL)
            var URLRequestNeeded = NSURLRequest(URL: URLRequest!)

            NSURLConnection.sendAsynchronousRequest(URLRequestNeeded, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!, error: NSError!) -> Void in
                if error == nil {
                    var picture = PFFile(data: data)
                    PFUser.currentUser()!["picture"] = picture
                    PFUser.currentUser()!.saveInBackgroundWithBlock({ (success, error) -> Void in
                        if error == nil {

                            var userPicture:PFFile = PFUser.currentUser()!.valueForKey("picture") as! PFFile
                            userPicture.getDataInBackgroundWithBlock { (imageData, error) -> Void in
                                if error == nil {

                                    self.meProfileImageView.image = UIImage(data: imageData!)
                                    var userName:String = PFUser.currentUser()!.valueForKey("username") as! String
                                    var userAge:Int = PFUser.currentUser()!.valueForKey("age") as! Int
                                    self.meLabel.text = "\(userName), \(userAge)"

                                    self.findFriends()

                                }
                            }

                        } else {
                            println(error)
                        }
                    })
                }
                else {
                    println("Error: \(error.localizedDescription)")
                }
            })
        }
    })
}

错误信息在这一行:

let birthday : NSString = (result.valueForKey("birthday") as? NSString)!

此代码在升级到 Facebook 的 SDK v4.5.1 之前运行良好,但我不知道现在要更改什么才能使其正常工作。非常感谢任何可以帮助我的人!

【问题讨论】:

    标签: ios xcode facebook swift facebook-graph-api


    【解决方案1】:

    这一行需要一个不为零的参数值

    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
    

    例如,我将展开更多,这是某种伪代码:

    例如,对于 ObjC,它会是这样,所以上面的内容将如下所示:

    parameters:@{@"fields": @"id, name"}
    

    很快就会有类似的东西

    类似这样的:

    parameters:["fields": "email"]
    

    这只是两个字段,又是伪代码,但你需要指定参数


    更新:

    我添加此更新是为了向人们展示您在哪里可以找到上述字段的参数,这是一个快速链接:

    这是 Paramters 字段信息(对于 FBSDK,这应该大致保持不变,其中一些是“核心”,这意味着它不会真正改变那么多,但我会随时更新):

    https://developers.facebook.com/docs/graph-api/reference/user

    以下信息的格式如下,有点,我只是快速完成了这个:

    “参数” “类型”

    “描述”

    id 数字字符串

    此人的用户帐户的 ID。此 ID 对每个应用程序都是唯一的 并且不能跨不同的应用程序使用。我们的升级指南提供 有关应用特定 ID 的更多信息

    关于字符串

    此人个人资料的“关于我”部分

    年龄范围年龄范围

    此人的年龄段表示为最小值和最大值 年龄。例如,大于 18,小于 21。

    简介字符串

    个人简介

    生日字符串

    这个人的生日。这是一个固定格式的字符串,如 MM/DD/YYYY。 但是,人们可以控制谁可以看到他们的出生年份 与月份和日期分开,所以这个字符串只能是年份 (YYYY) 或月 + 日 (MM/DD)

    上下文用户上下文

    此人的社会背景

    货币货币

    此人的当地货币信息

    设备列表

    此人正在使用的设备列表。这将只返回 iOS 和 安卓设备

    教育列表

    人的教育

    电子邮件字符串

    个人资料中列出的此人的主要电子邮件地址。这个领域 如果没有可用的有效电子邮件地址,将不会被退回

    favorite_athletes列表

    该人喜欢的运动员

    favorite_teams 列表

    这个人喜欢的运动队

    名字字符串

    这个人的名字

    性别字符串

    此人选择的性别,男性或女性。这个值将是 如果将性别设置为自定义值,则省略

    家乡页面

    这个人的家乡

    inspirational_people列表

    鼓舞人心的人

    install_type 枚举

    安装类型

    已安装 bool

    发出请求的应用程序是否已安装?

    有兴趣的人列表

    此人感兴趣的性别

    is_shared_login bool

    这是共享登录(例如灰色用户)

    is_verified布尔型

    拥有大量追随者的人可以具有真实性 他们的身份由 Facebook 手动验证。该字段表示 是否以这种方式验证此人的个人资料。这是与众不同的 来自经过验证的字段

    语言列表

    代表此人知道的语言的 Facebook 页面

    姓氏字符串

    这个人的姓

    链接字符串

    人的时间线的链接

    位置页面

    此人在个人资料中输入的当前位置。 该字段与签到无关

    语言环境字符串

    此人的语言环境

    meeting_for列表

    这个人有兴趣开会

    **middle_name 字符串

    这个人的中间名

    名称字符串

    此人的全名

    核心默认

    name_format 字符串

    人名的格式可以正确处理中文、日文或 韩国订购

    payment_pricepoints PaymentPricepoints

    此人的付款价格点

    test_group unsigned int32

    平台测试组

    政治字符串

    这个人的政治观点

    relationship_status 字符串

    此人的关系状况

    宗教字符串

    这个人的宗教信仰

    security_settings 安全设置

    安全设置

    significant_other用户

    这个人的另一半

    运动列表

    这个人喜欢的运动

    引号字符串

    这个人最喜欢的名言

    third_party_id 字符串

    一个包含匿名但唯一标识符的字符串 人。您可以将此标识符用于第三方

    时区浮动(最小值:-24)(最大值:24)

    此人当前时区与 UTC 的偏移量

    token_for_business 字符串

    在企业应用程序中相同的令牌。访问这个 令牌要求此人登录到您的应用程序。这个令牌 如果拥有该应用的企业发生变化,将会发生变化

    updated_time 日期时间

    更新时间

    shared_login_upgrade_required_by日期时间

    共享登录需要升级到商务管家的时间 由

    已验证 bool

    表示帐户是否已通过验证。这不同于 is_verified 字段。如果某人采取任何 以下操作:

    Register for mobile
    Confirm their account via SMS
    Enter a valid credit card
    

    video_upload_limits VideoUploadLimits

    视频上传限制

    viewer_can_send_gift bool

    观众可以给这个人送礼物吗?

    网站字符串

    此人的网站

    工作清单

    一个人的工作经历的细节

    public_key 字符串

    此人的 PGP 公钥

    封面封面照片


    此外,这是当前的“Edge”内容:“Edge”内容的格式大致是这样的,我很快就做到了:

    “边缘”

    “说明”

    favorite_requests

    开发者最喜欢的 Graph API 请求

    request_history

    开发者的 Graph API 请求历史

    帐户

    此人管理/是其管理员的 Facebook 主页

    成就

    在 Facebook 游戏中取得的成就

    广告帐户

    此人有权访问的广告帐户

    广告帐户组

    广告帐户组

    广告合同

    此人的广告合同

    admined_groups

    将用户管理员分组

    广告网络分析

    此人的 Audience Network 应用的洞察数据

    专辑

    此人创建的相册

    应用程序

    此人来自应用的待处理请求

    apprequestformerrecipients

    应用请求

    书籍

    此人的个人资料中列出的书籍

    用户管理的域

    事件

    此人的事件。默认情况下,这不包括事件 此人已拒绝或未回复

    家庭

    此人的家庭关系。

    stream_filters

    可应用于动态消息边缘的过滤器列表

    好友列表

    此人的自定义好友列表

    ids_for_business

    企业实体可以使用 业务经理。此边返回此用户拥有的 ID 列表 在任何其他应用中

    invitable_friends

    可受邀安装 Facebook Canvas 应用的好友列表

    游戏

    此人喜欢的游戏

    群组

    此人所属的 Facebook 群组

    点赞

    此人喜欢的所有页面

    电影

    此人喜欢的电影

    音乐

    此人喜欢的音乐

    对象

    对象

    权限

    此人授予此应用的权限

    照片

    此人被标记或已上传的照片

    图片

    此人的个人资料图片

    tagged_places

    此人的已标记地点列表。它可以包括视频标签, 帖子、状态或链接

    promotable_domains

    用户可以推广的所有域

    promotable_events

    用户可以推广的所有事件。

    taggable_friends

    可以在通过 Graph API 发布的内容中标记的朋友

    电视

    此人喜欢的电视节目

    视频

    此人被标记或上传的视频

    video_broadcasts

    来自此人的视频广播

    应用程序

    此人开发的 Facebook 应用。

    签到

    此人进行的签到。

    饲料

    帖子的提要(包括状态更新)和链接发布者 这个人。

    好友请求

    一个人的待处理好友请求。

    朋友

    一个人的朋友。

    首页

    一个人的 Facebook 主页提要。

    收件箱

    某人的 Facebook 消息收件箱。

    位置

    包含位置信息的帖子和照片的提要 此人已被标记。这对于构建一个有用的 该人去过的地方的年表。

    共同的朋友

    两个人的共同好友列表。

    通知

    一个人拥有的未读 Facebook 通知。

    发件箱

    某人的 Facebook 消息发件箱。

    问题

    一个人提出的问题。

    分数

    此人从 Facebook Games 获得的分数 玩过。

    订阅者

    关注此人的个人资料。

    订阅

    此人关注的个人资料。

    【讨论】:

    • 感谢到目前为止的帮助,但是 swift 的语法不起作用。我尝试了参数:["fields" : ["id", "birthday", "picture"] 但这也不起作用
    • 这就是我改变答案的原因,现在试试吧
    • 没有你试过你说的这个:["fields" : ["id", "birthday", "picture"] 这不是答案所显示的
    • 哦,这里有误会。我首先尝试了更新的答案。没看过原答案。然后我在我的评论中尝试了一个作为替代品。两者都不起作用。
    • 我在代码中放了适量的括号,只是在我的评论中打错了。
    【解决方案2】:

    在 Swift 中,你可以像这样声明多个参数:

    let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "email, first_name, last_name, gender, picture"])
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,但是在获取用户照片时添加字段选项会产生请求错误。我通过在代码中添加一个简单的parameters:@{@"fields": @""} 解决了这个问题:

      FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"me/picture"]
                                    parameters:@{@"fields": @""}
                                    HTTPMethod:@"GET"];
      [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                            id result,
                                            NSError *error) {
          if (!error) {
              // success
          } else {
              // fail
          }}
      ];
      

      【讨论】:

        【解决方案4】:

        在 Obj-C 中插入 logInWithReadPermissions 方法:

        parameters:@{@"fields": @"id, name, email"}
        

        如果您在参数中保留 nil,您只会在结果对象中收到 id 和 name,尽管您已经设置了例如:

        NSArray *permissionsArray = @[ @"email", @"public_profile"];
        

        文档中不是很清楚,希望对您有所帮助。

        【讨论】:

          【解决方案5】:

          使用“字段”作为键,然后用逗号分隔您的值

          let params = ["fields": "email, friends"]
          

          【讨论】:

          • 东西坏了,我收不到邮件
          • @adubey 你收到邮件了吗?
          • 是的,我做到了。发现这是 Facebook 方面的问题。我登录时在 Facebook 上创建的帐户,他们没有我的电子邮件,所以当我检索它时,我什么也没得到。我现在创建了新帐户,所以它可以工作了。
          • 电子邮件在 facebook 系统中可以为空。仅供参考。
          猜你喜欢
          • 2020-08-19
          • 2023-03-26
          • 1970-01-01
          • 2019-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多