it-roy-ru.com

GET-запрос API Graph Facebook - должен содержать параметр «fields» (Swift, Facebook SDK v4.5.1)

Мое приложение для iOS использует запрос API API Graph во время регистрации для получения информации о пользователе, которая работала нормально до обновления до новейшего SDK Facebook. После обновления я получаю сообщение об ошибке во время выполнения: "FBSDKLog: начиная с Graph API v2.4, запросы GET для/me должны содержать явный параметр" fields ".

Вот код:

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)!

Этот код прекрасно работал перед обновлением до SDK Facebook v4.5.1, но я не знаю, что нужно изменить, чтобы это работало сейчас. Огромное спасибо всем, кто может мне помочь!

54
Armin

эта строка нуждается в значении параметра, которое НЕ ноль

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

Я расширю, например, больше, и это своего рода код psuedo:

так для ObjC это будет, например, так, что выше будет читать следующее:

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

В Swift было бы что-то похожее

что-то вроде этого:

parameters:["fields": "email"]

Это только для двух полей, и снова это псевдо-код, но вам нужно указать параметры


UPDATE:

Я добавляю это обновление, чтобы показать людям, где вы найдете параметры для полей, как описано выше, вот быстрая ссылка:

Вот информация о поле Paramters (она должна оставаться примерно статичной с FBSDK, часть из них "core", что означает, что она не сильно изменится, но я буду обновлять всякий раз, когда смогу):

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

Формат информации ниже следующий, вроде, я просто сделал это быстро:

"параметр" "тип"

"Описание"

id числовая строка

Идентификатор учетной записи этого человека. Этот идентификатор уникален для каждого приложения и не может использоваться в разных приложениях. Наше руководство по обновлению содержит дополнительную информацию об идентификаторах приложений

о строке

Раздел Обо мне профиля этого человека

age_range AgeRange

Возрастной сегмент для этого человека выражен как минимальный и максимальный возраст. Например, больше 18, меньше 21.

био строка

Биография человека

день рождения строка

День рождения человека. Это строка фиксированного формата, например, MM/DD/YYYY. Однако люди могут контролировать, кто может видеть год своего рождения отдельно от месяца и дня, поэтому эта строка может быть только годом (ГГГГ) или месяц + день (ММ/ДД)

контекст UserContext

Социальный контекст для этого человека

валюта Валюта

Информация о местной валюте человека

список устройств

Список устройств, которые использует человек. Это вернет только устройства iOS и Android

список образования

Образование человека

электронная почта строка

Основной адрес электронной почты человека указан в его профиле. Это поле не будет возвращено, если действительный адрес электронной почты не доступен

список избранного

Спортсмены человек любит

список избранного

Спортивные команды человек любит

first_name строка

Имя человека

пол строка

Пол, выбранный этим человеком, мужчина или женщина. Это значение будет опущено, если пол установлен на пользовательское значение

родной город Страница

Родной город человека

inspirational_people список

Вдохновляющие люди

install_type enum

Тип установки

установлен bool

Приложение, выполняющее запрос, установлено?

список заинтересованных_

Пол заинтересовал человека

is_shared_login bool

Это общий логин (например, серый пользователь)

is_verified bool

Люди с большим количеством подписчиков могут проверить подлинность своей личности вручную в Facebook. В этом поле указывается, проверен ли профиль человека таким образом. Это отличается от проверенного поля

список языков

Facebook Страницы, представляющие языки, которые знает этот человек

last_name строка

Фамилия человека

ссылка строка

Ссылка на временную шкалу человека

Местоположение Страница

Текущее местоположение человека, указанное в его профиле. Это поле не относится к регистрации

локаль строка

Локаль человека

meeting_for список

Для чего человек заинтересован во встрече

** строка среднего имени

Отчество человека

имя строка

Полное имя человека

CoreDefault

name_format строка

Имя человека отформатировано для правильной обработки китайского, японского или корейского заказа

payment_pricepoints PaymentPricepoints

Человек платит цены

test_group unsigned int32

Тестовая группа платформы

политическая строка

Политические взгляды человека

отношение_статуса строка

Статус отношений человека

религия строка

Религия человека

security_settings SecuritySettings

Настройки безопасности

значительное_другой пользователь

Человек значимый другой

спортивный список

Спорт этот человек любит

кавычки строка

Любимые цитаты человека

3rd_party_id строка

Строка, содержащая анонимный, но уникальный идентификатор человека. Вы можете использовать этот идентификатор с третьими лицами

часовой пояс float (мин: -24) (макс: 24)

Текущее смещение часового пояса человека от UTC

строка token_for_business

Токен, который одинаков для всех бизнес-приложений. Доступ к этому токену требует, чтобы человек вошел в ваше приложение. Этот токен изменится, если изменится бизнес, владеющий приложением

updated_time datetime

Обновленное время

shared_login_upgrade_required_by datetime

Время, когда общий логин необходимо обновить до Business Manager

проверено 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

cover CoverPhoto


Кроме того, вот текущий материал "Edge": формат материала "Edge" таков, примерно, я сделал это быстро:

"Край"

"Описание"

favorite_requests

Любимые запросы разработчиков к Graph API

request_history

История запросов API API для разработчиков

счета

Страницы Facebook этот человек управляет/является администратором для

достижения

Достижения, сделанные в играх Facebook

adaccounts

Рекламные аккаунты, к которым у этого человека есть доступ

adaccountgroups

Группы рекламных аккаунтов

adcontracts

Рекламные контракты человека

admined_groups

Группирует пользователей админов

adnetworkanalytics

Данные аналитики для приложений сети Audience человека

альбомов

Фотоальбомы, созданные этим человеком

apprequests

Ожидающие запросы этого человека из приложения

apprequestformerrecipients

Запросы приложений

книги

Книги, перечисленные в профиле этого человека

домены

Домены пользователя админы

события

События для этого человека. По умолчанию это не включает события, от которых пользователь отказался или не ответил

семья

Семейные отношения этого человека.

stream_filters

Список фильтров, которые можно применить к краю новостной ленты

friendlists

Пользовательские списки друзей этого человека

ids_for_business

Бизнес-объекты могут претендовать на владение несколькими приложениями с помощью Business Manager. This Edge возвращает список идентификаторов, которые этот пользователь имеет в любом из этих других приложений

invitable_friends

Список друзей, которых можно пригласить для установки приложения Facebook Canvas

игры

Игры, которые любит этот человек

группы

Группы Facebook, к которым принадлежит человек

любит

Все страницы, которые понравились этому человеку

фильмы

Фильмы, которые любит этот человек

музыка

Музыка, которую любит этот человек

объекты

Объекты

разрешения

Разрешения, которые человек предоставил это приложение

фотографии

Фотографии, на которых человек отмечен или загружен

картина

Фотография профиля человека

tagged_places

Список отмеченных мест для этого человека. Он может включать теги на видео, сообщения, статусы или ссылки

promotable_domains

Все домены, которые пользователь может продвигать

promotable_events

Все события, которые пользователь может продвигать.

taggable_friends

Друзья, которых можно пометить в контенте, опубликованном через Graph API

телевидение

Телешоу любит этот человек

видео

Видео, на которых человек отмечен или загружен

video_broadcasts

Видео трансляции от этого человека

приложения

Приложения Facebook, разработчиком которых является этот человек.

возвраты

Проверки, сделанные этим человеком.

кормить

Лента сообщений (включая обновления статуса) и ссылки, опубликованные этим человеком.

friendrequests

Запросы друзей в ожидании.

друзья

Друзья человека.

домой

Фид главной страницы человека на Facebook.

Входящие

Входящие сообщения в Facebook.

местоположения

Фид сообщений и фотографий, которые содержат информацию о местоположении и в которых этот человек был помечен. Это полезно для построения хронологии мест, которые посетил человек.

mutualfriends

Список общих друзей между двумя людьми.

уведомления

Непрочитанные уведомления Facebook, которые есть у человека.

сходящие

Исходящие сообщения Facebook на человека.

вопросы

Вопросы, которые создал человек.

оценки

Очки, полученные этим человеком из игр Facebook, в которые он играл.

абонентов

Профили, которые следуют за этим человеком.

subscribedto

Профиль, за которым следит этот человек.

121
Loxx

используйте "поля" в качестве ключа, а затем запятую разделяйте ваши значения

let params = ["fields": "email, friends"]
26
Hugo Perez

В Obj-C вставьте в метод logInWithReadPermissions:

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

если вы оставите nil в параметрах, вы получите только id и name в результирующем объекте, хотя вы установили, например:

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

Это не очень ясно в документации, надеюсь, это поможет.

12
José Miguel Galván

У меня была та же проблема, но добавление параметров поля привело бы к ошибке запроса при получении пользовательской фотографии. Я решил эту проблему, добавив простой код 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
    }}
];
6
Paula Vasconcelos Gueiros

В Swift вы можете объявить несколько параметров следующим образом:

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