2016-09-25 90 views
12

我正在用最新的Swift3重写我的图形请求。我遵循这里找到的指南 - https://developers.facebook.com/docs/swift/graph使用Swift3的Facebook图形请求 -

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上并不是最新的,但我不确定这是否是问题所在。

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

谢谢。

回答

42

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

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

享受。

+0

如何获取图片?responseDictionary [“picture”] as Any。我正在获得另一个数组 –

4

这是我的代码。我使用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 
2

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

此代码的工作对我来说,首先我做一个登录使用正确的权限,然后我建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)") 
       } 
      } 
     } 
    })