(Xcode 10) Преобразование API-интерфейса Graph из swift 3 в swift 5 для Facebook SDK - PullRequest
0 голосов
/ 22 января 2020

Я занимаюсь разработкой приложения, которое позволяет пользователю войти в систему с помощью Facebook. Фрагмент кода, который я использую, использует swift 3 tho, и я не могу найти конвертер онлайн. Код swift 3 выглядит следующим образом:

В примере, приведенном в swift 3, Xcode предлагает:

request.start(completion: ((HTTPURLResponse?, GraphRequestResult<GraphRequest>) -> Void)?)

И затем вводит программист (это целая функция):

func getUserInfo(completion: @escaping (_ : [String: Any]?, _ : Error?) -> Void) {

    let request = GraphRequest(graphPath: "me", parameters: ["fields" : "id,email,picture"])

    request.start { response, result in

        switch result {
        case .failed(let error):
            completion(nil, error)
        case .success (let graphResponse):
            completion(graphResponse.dictionaryValue, nil)
        }
    }

Когда я начинаю печатать:

request.start

, что дает мне эту строку кода:

request.start(completionHandler: GraphRequestBlock?)

Может кто-нибудь помочь мне преобразовать это из swift 3 в swift 5? Спасибо!

--- Код комментария ---

@ HardikS

Мой файл "HomeAfterLogInViewController.swift" выглядит следующим образом:

import Foundation
import FacebookCore
import FacebookLogin

class HomeAfterLogInViewController: UIViewController
{
    override func viewDidLoad()
    {
        super.viewDidLoad()

        getFacebookProfileInfo()
    }
}

func getFacebookProfileInfo()
{
    let requestMe = GraphRequest.init(graphPath: "me", parameters: ["fields" : "id,name,email,picture.type(large)"])

    let connection = GraphRequestConnection()

    connection.add(requestMe, completionHandler:{ (connectn, userresult, error) in

        if let dictData: [String : Any] = userresult as? [String : Any]
        {
            DispatchQueue.main.async
                {
                    if let pictureData: [String : Any] = dictData["picture"] as? [String : Any]
                    {
                        if let data : [String: Any] = pictureData["data"] as? [String: Any]
                        {
                            print(data)
                            print(dictData["email"]!)
                      }
                  }
              }
          }
      })
      connection.start()
  }

И этот код работает, но мне нужен еще один шаг - объяснено на скриншоте:

enter image description here

Ответы [ 3 ]

2 голосов
/ 23 января 2020
        func getFacebookProfileInfo() {
        let requestMe = GraphRequest.init(graphPath: "me", parameters: ["fields" : "id,name,email,picture.type(large)"])
        let connection = GraphRequestConnection()
        connection.add(requestMe, completionHandler: { (connectn, userresult, error) in
            if let dictData: [String : Any] = userresult as? [String : Any] {
                DispatchQueue.main.async {
                    if let pictureData: [String : Any] = dictData["picture"] as? [String : Any] {
                        if let data : [String: Any] = pictureData["data"] as? [String: Any] {

                            print(data)
                            print(dictData["email"]!)

                        }
                    }
                }
            }
        })
        connection.start()
    }
1 голос
/ 23 января 2020

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

let params = ["fields":"email, id, name, first_name, last_name,gender"]//, user_gender, user_birthday"]

let request = GraphRequest(graphPath: "me", parameters: params, accessToken: AccessToken.current, httpMethod: .GET, apiVersion: FacebookCore.GraphAPIVersion.defaultVersion)
        request.start { (response, result) in
            switch result {
            case .success(let value):
                print(value.dictionaryValue!)
                var parsedData = value.dictionaryValue as Dictionary<String, AnyObject>?

                if let firstName = parsedData?["first_name"] {
                    print("First Name: \(firstName)")
                }

                if let lastName = parsedData?["last_name"] {
                    print("Last Name: \(lastName)")
                }

                if let email = parsedData?["email"] {
                    print("Email: \(email as! String)")
                }

                if let id = parsedData?["id"] {
                    let faceBookId = id as! String
                    print("Facebook Id: \(faceBookId)")

                    //you can get profile picture URL here.
                    let pictureURL = "https://graph.facebook.com/" + "\(faceBookId)/" + "picture?type=large&return_ssl_resources=1"
                    print("Profile Picture URL: \(pictureURL)")
                }

            case .failed(let error):
                print(error.localizedDescription)
            }
}
1 голос
/ 23 января 2020
GraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
                if error == nil{
                    //everything works print the user data
                    if let userInfo = result as? [String: Any] {
                        if let email = userInfo["email"] as? String {
                            let firstName = userInfo["first_name"] as? String
                            let lastName = userInfo["last_name"] as? String
                            var profilePicUrl: String? = nil
                            if let fbUserId = userInfo["id"] as? String {
                                profilePicUrl = "http://graph.facebook.com/\(fbUserId)/picture?type=large"
                            }
                            //Do your operations here.
                        }
                    }
                }
            })

Надеюсь, что это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...