web-dev-qa-db-fra.com

Demande de graphique Facebook avec Swift3 -

Je réécris mes demandes de graphique avec le dernier Swift3. Je suis le guide trouvé ici - https://developers.facebook.com/docs/Swift/graph .

fileprivate struct UserProfileRequest: GraphRequestProtocol {
    struct Response: GraphResponseProtocol {
        init(rawResponse: Any?) {
            // Decode JSON into other properties

        }
    }

    let graphPath: String = "me"
    let parameters: [String: Any]? = ["fields": "email"]
    let accessToken: AccessToken? = AccessToken.current
    let httpMethod: GraphRequestHTTPMethod = .GET
    let apiVersion: GraphAPIVersion = .defaultVersion
}


fileprivate func returnUserData() {


    let connection = GraphRequestConnection()
    connection.add(UserProfileRequest()) {
        (response: HTTPURLResponse?, result: GraphRequestResult<UserProfileRequest.Response>) in
        // Process
    }
    connection.start()

Cependant, j'obtiens cette erreur dans la méthode connection.add:

Type ViewController.UserProfileRequest.Response does not conform to protocol GraphRequestProtocol.

Je n'arrive pas à comprendre ce qu'il faut changer ici. Il semble que le guide du développeur ne soit pas à jour sur Swift3, mais je ne suis pas sûr que ce soit le problème.

Quelqu'un peut-il voir ce qui ne va pas ici?

Merci.

17
Gavin

En parcourant les problèmes de github, j'ai trouvé une solution.
https://github.com/facebook/facebook-sdk-Swift/issues/6

La documentation Facebook pour Swift 3.0 et SDK 0.2.0 n'est pas encore mise à jour.

Cela fonctionne pour moi:

    let params = ["fields" : "email, name"]
    let graphRequest = GraphRequest(graphPath: "me", parameters: params)
    graphRequest.start {
        (urlResponse, requestResult) in

        switch requestResult {
        case .failed(let error):
            print("error in graph request:", error)
            break
        case .success(let graphResponse):
            if let responseDictionary = graphResponse.dictionaryValue {
                print(responseDictionary)

                print(responseDictionary["name"])
                print(responseDictionary["email"])
            }
        }
    }

prendre plaisir.

49
elp

Ce code fonctionne pour moi, d'abord je me connecte avec les autorisations appropriées, puis je crée le GraphRequest pour obtenir les informations utilisateur.

let login: FBSDKLoginManager = FBSDKLoginManager()
    // Make login and request permissions
    login.logIn(withReadPermissions: ["email", "public_profile"], from: self, handler: {(result, error) -> Void in

        if error != nil {
            // Handle Error
            NSLog("Process error")
        } else if (result?.isCancelled)! {
            // If process is cancel
            NSLog("Cancelled")
        }
        else {
            // Parameters for Graph Request without image
            let parameters = ["fields": "email, name"]
            // Parameters for Graph Request with image
            let parameters = ["fields": "email, name, picture.type(large)"]

            FBSDKGraphRequest(graphPath: "me", parameters: parameters).start {(connection, result, error) -> Void in
                if error != nil {
                    NSLog(error.debugDescription)
                    return
                }

                // Result
                print("Result: \(result)")

                // Handle vars
                if let result = result as? [String:String],
                    let email: String = result["email"], 
                    let fbId: String = result["id"], 
                    let name: String = result["name"] as? String, 
                    // Add this lines for get image
                    let picture: NSDictionary = result["picture"] as? NSDictionary,
                    let data: NSDictionary = picture["data"] as? NSDictionary,
                    let url: String = data["url"] as? String {

                    print("Email: \(email)")
                    print("fbID: \(fbId)")
                    print("Name: \(name)")
                    print("URL Picture: \(url)")
                }
            }
        }
    })
9
Santiago Restrepo

Voici mon code comme. J'utilise Xcode 8, Swift 3 et cela fonctionne bien pour moi.

let parameters = ["fields": "email, id, name"]
            let graphRequest = FBSDKGraphRequest(graphPath: "me", parameters: parameters)

            _ = graphRequest?.start { [weak self] connection, result, error in
                // If something went wrong, we're logged out
                if (error != nil) {
                    // Clear email, but ignore error for now
                    return
                }

                // Transform to dictionary first
                if let result = result as? [String: Any] {
                    // Got the email; send it to Lucid's server
                    guard let email = result["email"] as? String else {
                        // No email? Fail the login
                        return
                    }
                    guard let username = result["name"] as? String else {
                        // No username? Fail the login
                        return
                    }

                    guard let userId = result["id"] as? String else {
                        // No userId? Fail the login
                        return
                    }                       
                }
            } // End of graph request
5
Cheng Yang Chen

Votre UserProfileRequest devrait ressembler à ceci:

fileprivate struct UserProfileRequest: GraphResponseProtocol {
  fileprivate let rawResponse: Any?

  public init(rawResponse: Any?) {
    self.rawResponse = rawResponse
  }

  public var dictionaryValue: [String : Any]? {
    return rawResponse as? [String : Any]
  }

  public var arrayValue: [Any]? {
    return rawResponse as? [Any]
  }

  public var stringValue: String? {
    return rawResponse as? String
  }
}
3
Ivo Stoyanov