Swift版本的iOS iOS SDK以及如何访问Response中的数据

时间:2017-04-04 01:34:17

标签: swift facebook-graph-api

我接管了一个Swift项目,需要添加Facebook登录功能。我得到它主要工作,但这里的示例代码有问题(https://developers.facebook.com/docs/swift/graph):

导入FacebookCore

struct MyProfileRequest: GraphRequestProtocol {
  struct Response: GraphResponseProtocol {
    init(rawResponse: Any?) {
      // Decode JSON from rawResponse into other properties here.
    }
  }

  var graphPath = "/me"
  var parameters: [String : Any]? = ["fields": "id, name"]
  var accessToken = AccessToken.current
  var httpMethod: GraphRequestHTTPMethod = .GET
  var apiVersion: GraphAPIVersion = .defaultVersion
}


let connection = GraphRequestConnection()
connection.add(MyProfileRequest()) { response, result in
  switch result {
  case .success(let response):
    print("Custom Graph Request Succeeded: \(response)")
    print("My facebook id is \(response.dictionaryValue?["id"])")
    print("My name is \(response.dictionaryValue?["name"])")
  case .failed(let error):
    print("Custom Graph Request Failed: \(error)")
  }
}
connection.start()

我在使用dictionaryValue可选说法/Users/jt/a-dev/tabfb/tabfb/LoginViewController.swift:72:31: Value of type 'MyProfileRequest.Response' has no member 'dictionaryValue'编译该行时遇到错误。我如何使用它来访问用户名或ID?

2 个答案:

答案 0 :(得分:7)

我今天也遇到了这个问题。我在MyProfileRequest

中获得了用户ID和名称
struct Response: GraphResponseProtocol {
    init(rawResponse: Any?) {
        // Decode JSON from rawResponse into other properties here.
        guard let response = rawResponse as? Dictionary<String, Any> else {
            return
        }

        if let name = response["name"],
            let id = response["id"] {

            print(name)
            print(id)
        }
    }
}

编辑:我重新设计了这样的代码,以使用.success(let response)案例中的值

struct Response: GraphResponseProtocol {

    var name: String?
    var id: String?
    var gender: String?
    var email: String?
    var profilePictureUrl: String?

    init(rawResponse: Any?) {
        // Decode JSON from rawResponse into other properties here.
        guard let response = rawResponse as? Dictionary<String, Any> else {
            return
        }

        if let name = response["name"] as? String {
            self.name = name
        }

        if let id = response["id"] as? String {
            self.id = id
        }

        if let gender = response["gender"] as? String {
            self.gender = gender
        }

        if let email = response["email"] as? String {
            self.email = email
        }

        if let picture = response["picture"] as? Dictionary<String, Any> {

            if let data = picture["data"] as? Dictionary<String, Any> {
                if let url = data["url"] as? String {
                    self.profilePictureUrl = url
                }
            }
        }
    }
}

在成功案例中,您可以获得如下值:

let connection = GraphRequestConnection()
connection.add(MyProfileRequest()) { response, result in
  switch result {
  case .success(let response):
    print("My facebook id is \(response.id!)") //Make sure to safely unwrap these :)
    print("My name is \(response.name!)")
  case .failed(let error):
    print("Custom Graph Request Failed: \(error)")
 }
}
connection.start()

答案 1 :(得分:1)

import FBSDKLoginKit //FBSDKLoginKit installs automatically when you install FacebookCore through CocoaPods

 ///Inside your view controller
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
    /// DEFAULT
    //fired when fb logged in through fb's default login btn
    if error != nil {
        print(error)
        return
    }

    showDetails()
}

fileprivate func showDetails(){
    FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, first_name, last_name, email, gender"]).start { (connection, result, err) in
        ////use link for more fields:::https://developers.facebook.com/docs/graph-api/reference/user
        if err != nil {
            print("Failed to start graph request:", err ?? "")
            return
        }

        let dict: NSMutableDictionary = result as! NSMutableDictionary
        print("The result dict of fb profile::: \(dict)")
        let email = dict["email"] as! String!
         print("The result dict[email] of fb profile::: \(email)")
        let userID = dict["id"] as! String
        print("The result dict[id] of fb profile::: \(userID)")

//            self.profileImage.image = UIImage(named: "profile")
        let facebookProfileUrl = "http://graph.facebook.com/\(userID)/picture?type=large"

    }
}

//make sure you add read permissions for email and public profile

override func viewDidLoad(){
    super.viewDidLoad()
    loginButtonFromFB.delegate = self //inherit FBSDKLoginButtonDelegate to your class
    loginButtonFromFB.readPermissions = ["email", "public_profile"]
}