【问题标题】:Converting Graph API from Swift 3 to Swift 5 for Facebook SDK为 Facebook SDK 将 Graph API 从 Swift 3 转换为 Swift 5
【发布时间】:2020-05-09 00:43:57
【问题描述】:

我正在开发一个允许用户使用 Facebook 登录的应用程序。我拥有的代码 sn-p 虽然使用的是 Swift 3,但我在网上找不到转换器。 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?

评论后更新

我的“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()
  }

这段代码有效,但我还需要一步 - 在屏幕截图中解释:

【问题讨论】:

    标签: ios facebook-graph-api swift3 facebook-sdk-4.0 swift5


    【解决方案1】:
            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()
        }
    

    【讨论】:

    • 我收到此错误:使用未解析的标识符“self”
    • 这会在 HomeAfterLogInViewController.storyboard 上显示用户图片吗?
    • 我的代码工作了!我没有调用这个函数,愚蠢的我!我还有一个问题,请参阅添加的问题截图!非常感谢您的帮助!
    【解决方案2】:

    试试下面的代码来获取用户的信息。

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

    【讨论】:

    • 嗨@HardikS,我遇到了一些错误!我已经更新了我的代码给你看,请查看名为“--- After Comment Code ---”的部分
    【解决方案3】:
    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.
                            }
                        }
                    }
                })
    

    希望这会有所帮助!

    【讨论】:

    • 如何使用此功能显示用户图片
    • @RossCurrie 请检查我的答案。我已经更新了获取个人资料图片的代码。
    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多