使用Swift3的Facebook图形请求 -

时间:2016-09-25 05:54:21

标签: swift facebook facebook-graph-api facebook-ios-sdk

我用最新的Swift3重写我的图形请求。我正在按照此处的指南进行操作 - 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()

但是,我在connection.add方法中遇到此错误:

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

我似乎无法弄明白这里要改变什么。看起来开发人员指南在Swift3上并不是最新的,但我不确定是不是问题。

有人能够看到这里有什么问题吗?

感谢。

4 个答案:

答案 0 :(得分:49)

浏览github问题,我找到了解决方案 https://github.com/facebook/facebook-sdk-swift/issues/63

Swift 3.0和SDK 0.2.0的Facebook文档尚未更新。

这对我有用:

public @ResponseBody
    ResponseEntity<DocumentId> addDoc(@RequestPart(required = true) MultipartFile file, @RequestPart(required = false) String folder, @RequestPart(required = true) MetadataDoc metadata)

享受。

答案 1 :(得分:9)

此代码适用于我,首先我使用正确的权限进行登录,然后构建GraphRequest以获取用户信息。

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

答案 2 :(得分:5)

这是我的代码。我使用Xcode 8,Swift 3,它对我来说很好。

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

答案 3 :(得分:3)

您的UserProfileRequest应如下所示:

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