如何从 Facebook + Swift + Parse 获取封面照片

Posted

技术标签:

【中文标题】如何从 Facebook + Swift + Parse 获取封面照片【英文标题】:How to get the cover photo from Facebook + Swift + Parse 【发布时间】:2015-10-22 14:32:25 【问题描述】:

我的应用程序 swift 2.0 与 Facebook 集成了一个登录系统,我能够获取一些用户信息和 profile_picture。

我想知道如何从登录的用户那里获取封面图片:

let requestParameters = ["fields": "id, email, first_name, last_name, name, gender, cover"]

    let userDetails = FBSDKGraphRequest(graphpath: "me", parameters: requestParameters)

    userDetails.startWithCompletionHandler  (connection, result, error:NSError!) -> Void in

        if(error != nil)
        
            print("\(error.localizedDescription)")
            return
        

        if(result != nil)
        

            let userId:String = result["id"] as! String
            let userFirstName:String? = result["first_name"] as? String
            let userLastName:String? = result["last_name"] as? String
            let userEmail:String? = result["email"] as? String
            let userName:String? = result["name"] as? String
            let userGender:String? = result["gender"] as? String
            let userCover:UIImage? = result["cover"] as? UIImage

            print(requestParameters)
            print(userDetails)
            print(userCover)
            print("\(userEmail)")

            let myUser:PFUser = PFUser.currentUser()!

            // Save first name
            if(userFirstName != nil)
            
                myUser.setObject(userFirstName!, forKey: "firstNameColumn")

            

            //Save last name
            if(userLastName != nil)
            
                myUser.setObject(userLastName!, forKey: "lastNameColumn")
            

            // Save email address
            if(userEmail != nil)
            
                myUser.setObject(userEmail!, forKey: "email")
            

            // Save email address
            if(userGender != nil)
            
                if (userGender == "male")
                myUser.setObject("Masculino", forKey: "genderColumn")
                 else 
                    myUser.setObject("Feminino", forKey: "genderColumn")
                
            





            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) 

                // Get Facebook profile picture
                let userProfile = "https://graph.facebook.com/" + userId + "/picture?type=large"

                let profilePictureUrl = NSURL(string: userProfile)

                let profilePictureData = NSData(contentsOfURL: profilePictureUrl!)

                if(profilePictureData != nil)
                
                    let profileFileObject = PFFile(data:profilePictureData!)
                    myUser.setObject(profileFileObject!, forKey: "photoUserColumn")
                


                myUser.saveInBackgroundWithBlock( (success:Bool, error:NSError?) -> Void in

                    if(success)
                    
                        print("User details are now updated")
                    

                )



            

此代码不适用于封面图片。

有什么想法吗?

【问题讨论】:

How to take cover_photo from Facebook in swift 2.0的可能重复 不,不是,我使用的是正确的字段cover而不是pic_cover 我知道。但是您会在另一个问题的示例代码中找到解决问题的方法 【参考方案1】:

这是一个在 swift 中使用 fb sdk 的工作示例。我也在另一个问题中发布了这个答案,但是因为这个答案首先出现在谷歌上,所以我认为把它也放在这里会很好。

我需要获取页面的封面照片,因此在 graphPath 中我使用了页面 ID。可以轻松更改此参数以适合用户/事件/等...

let request = FBSDKGraphRequest(graphPath: "\\(page.id)?fields=cover", parameters: [
  "access_token": "your_access_token"
], HTTPMethod: "GET")
request.startWithCompletionHandler((connection , result , error) in
  if ((error) != nil) 
    print("Error in fetching cover photo for \\(page.id): \(error)", terminator: "")
  
  else 
    if let data = result["cover"] as? NSDictionary 
      self.fetchImageFromUrl(data["source"] as! String, cb: (image: UIImage) -> Void in
        //do something with image
      )
    
  )

func fetchImageFromUrl(url: String, cb: (UIImage) -> Void) 
  let urlObj = NSURL(string: url)!
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) 
    let data = NSData(contentsOfURL: urlObj)
    dispatch_async(dispatch_get_main_queue(), 
      let image = UIImage(data: data!)!
      cb(image)
    );
  

P.S - 我是 swift / ios 的新手,所以这段代码可能不是最好的。评论将不胜感激。

【讨论】:

【参考方案2】:

这很有用。

let emailRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name, id,cover"], tokenString: result?.token.tokenString, version: nil, httpMethod: "GET")
    _ = emailRequest?.start(completionHandler:  (nil, resultParameters, error) in
         if(error == nil) 
                 if let cover = (params?["cover"] as? NSDictionary)["source"] 
                    var coverUrl = cover as?  String
           
        
)

【讨论】:

以上是关于如何从 Facebook + Swift + Parse 获取封面照片的主要内容,如果未能解决你的问题,请参考以下文章

如何从 swift 3 facebook 图形请求中解析这个 JSON

如何使用 Swift 3 从 Facebook SDK 下载照片?

如何从我的 Swift 应用程序请求 Facebook publish_actions 权限?

如何在 Swift 3 中获取 Facebook 用户 ID、电子邮件、图片类型(大)

使用 swift 从 Facebook SDK GraphRequest 获取进度

如何在 Swift 中从 Facebook 获取用户名