web-dev-qa-db-ja.com

Swift3を使用したFacebookグラフリクエスト-

グラフリクエストを最新の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の最新情報ではないようですが、それが問題かどうかはわかりません。

誰がここで間違っているのかを見ることができますか?

ありがとう。

17
Gavin

Githubの問題を参照して、解決策を見つけました。
https://github.com/facebook/facebook-sdk-Swift/issues/6

Swift 3.0およびSDK 0.2.0のFacebookドキュメントはまだ更新されていません。

これは私のために働く:

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

楽しい。

49
elp

このコードは私のために機能します。最初に正しい権限でログインし、次にユーザー情報を取得するために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)")
                }
            }
        }
    })
9

これが私のコードです。私は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
5
Cheng Yang Chen

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
  }
}
3
Ivo Stoyanov