Facebook Graph API GET 请求 - 应包含“字段”参数(Swift,Facebook SDK v4.5.1)

Posted

技术标签:

【中文标题】Facebook Graph API GET 请求 - 应包含“字段”参数(Swift,Facebook SDK v4.5.1)【英文标题】:Facebook Graph API GET request - Should contain "fields" parameter (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 之前运行良好,但我不知道现在要更改什么才能使其正常工作。非常感谢任何可以帮助我的人!

【问题讨论】:

【参考方案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 系统中可以为空。仅供参考。

以上是关于Facebook Graph API GET 请求 - 应包含“字段”参数(Swift,Facebook SDK v4.5.1)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 facebook graph api 请求中使用 cURL

Instagram Graph Api 为最近的媒体 GET 请求返回空数据

Facebook Graph API 调用未检索所有字段

Facebook Graph API - 来自批处理请求的同步响应

Facebook Graph API /me 请求

facebook graph api get /me/scores 不适用于所有用户