通过Facebook Graph API在Swift中获取个人资料图片返回“不支持的URL”

11

我正在开发一款iOS应用程序,用户应该使用Facebook登录。所以我试图获取用户的个人资料图片,但以下代码返回“不支持的URL”错误信息:"unsupported URL"

FBRequestConnection.startWithGraphPath("\(userID)/picture?type=large&access_token=207613839327374|BgKi3AePtvg1oDO8GTbWqqLE_SM", completionHandler: { (connection, result, error) -> Void in
   if (error? != nil){
      NSLog("error = \(error)")
   }else{
      println(result)
   }
})

更新

以下更改:

FBRequestConnection.startWithGraphPath("\(userID)/picture?type=large", completionHandler: { (connection, result, error) -> Void in
  if (error? != nil){
    NSLog("error = \(error)")
  }else{
    println(result)
  }
})

返回:

error = Error Domain=com.facebook.sdk Code=6 "Response is a non-text MIME type; endpoints that return images and other binary data should be fetched using NSURLRequest and NSURLConnection" UserInfo=0x786d4790
6个回答

12

你可以这样做:

    // accessToken is your Facebook id
    func returnUserProfileImage(accessToken: NSString)
    {
        var userID = accessToken as NSString
        var facebookProfileUrl = NSURL(string: "http://graph.facebook.com/\(userID)/picture?type=large")

        if let data = NSData(contentsOfURL: facebookProfileUrl!) {
            imageProfile.image = UIImage(data: data)
        }

    }

这是我获取我的Facebook ID的方法:

func returnUserData()
{
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in

        if ((error) != nil)
        {
            // Process error
            println("Error: \(error)")
        }
        else
        {
            println("fetched user: \(result)")

            if let id: NSString = result.valueForKey("id") as? NSString {
                println("ID is: \(id)")
                self.returnUserProfileImage(id)
            } else {
                println("ID es null")
            }


        }
    })
}

我当时使用的是 Xcode 6.4Swift 1.2


这个可行,我认为应该是正确的答案,因为Parse不再有PFFacebookUtils.session()了。 - C0D3
现在使用Swift 3,并尝试了这个,但却出现了“在解包可选值时意外发现nil”的错误。 - Good Game Industries

10

可以使用以下代码获取:

    // Get user profile pic
    var fbSession = PFFacebookUtils.session()
    var accessToken = fbSession.accessTokenData.accessToken
    let url = NSURL(string: "https://graph.facebook.com/me/picture?type=large&return_ssl_resources=1&access_token="+accessToken)
    let urlRequest = NSURLRequest(URL: url!)

    NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) { (response:NSURLResponse!, data:NSData!, error:NSError!) -> Void in

        // Display the image
        let image = UIImage(data: data)
        self.imgProfile.image = image  

    }

1
PFFacebookUtils在新的ParseSDK中没有'member'会话。 - C0D3

2
使用PFFacebookUtils,您可以获取像这样的个人资料图片:
let pictureRequest = FBSDKGraphRequest(graphPath: "me/picture?type=normal&redirect=false", parameters: nil)
pictureRequest.startWithCompletionHandler({
                            (connection, result, error: NSError!) -> Void in

   if error == nil && result != nil {

     let imageData = result.objectForKey("data") as! NSDictionary
     let dataURL = data.objectForKey("url") as! String
     let pictureURL = NSURL(string: dataURL)
     let imageData = NSData(contentsOfURL: pictureURL!)
     let image = UIImage(data: imageData!)

   }
})

2

抱歉,它返回了这个错误 >> 错误 = 错误域=com.facebook.sdk 代码=6 "响应是非文本 MIME 类型;返回图像和其他二进制数据的端点应使用 NSURLRequest 和 NSURLConnection 获取" - adolfosrs
所以你正在尝试打印输出结果,这个结果应该是“NSData”类型的? - Dani
nop,我尝试注释掉打印行,但错误仍然存在。 - adolfosrs
2
/userID/picture 返回二进制数据(图片本身,而不是图形API数据),因此您应该直接使用NSURLRequest和NSURLConnection,而不是创建FBRequestConnection。 - Ming Li
@adolfosrs 如果你想要显示图片,可以使用我的代码,并从你接收到的NSData创建UIImage。我不明白为什么你想要使用Graph API?除了获取图像本身之外,它还能给你带来什么额外的价值呢? - Dani
显示剩余2条评论

1
这行代码用于获取个人资料图片,目前运行正常。
@IBOutlet var profilePic: UIImageView!
func loginViewFetchedUserInfo(loginView: FBLoginView!, user:      FBGraphUser!) {

    println("User:\(user)")
    println("User ID:\(user.objectID)")
    println("User Name:\(user.name)")
    var userEmail = user.objectForKey("email") as String
    println("User Email:\(userEmail)")
    // Get user profile pic
    let url = NSURL(string: "https://graph.facebook.com/\(user.objectID)/picture?type=large")
    let urlRequest = NSURLRequest(URL: url!)

    NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) { (response:NSURLResponse!, data:NSData!, error:NSError!) -> Void in

        // Display the image
        let image = UIImage(data: data)
        self.profilePic.image = image

    }
}

1
我的例子。请不要关注用户。
import Foundation
import FBSDKCoreKit
import FBSDKLoginKit
import SVProgressHUD
import SDWebImage

class FacebookManager {

    // MARK: - functions
    static func getFacebookProfileData(comletion: ((user: User?, error: NSError?) -> ())?) {
        SVProgressHUD.showWithStatus(StringModel.getting)
        let loginManager = FBSDKLoginManager()
        loginManager.loginBehavior = .SystemAccount
        loginManager.logInWithReadPermissions(nil, fromViewController: nil) { (tokenResult, error) in
            if error == nil {
                guard let token = tokenResult?.token?.tokenString else {
                    SVProgressHUD.dismiss()
                    return
                }
                getFacebookProfile(token, completion: { (error, user) in
                    if error == nil {
                        comletion?(user: user, error: error)
                        SVProgressHUD.dismiss()
                    } else {
                        SVProgressHUD.dismiss()
                        print(error?.localizedDescription)
                    }
                })
            } else {
                SVProgressHUD.dismiss()
                print(error.localizedDescription)
            }
        }
    }

    private static func getFacebookProfile(token: String, completion: ((error: NSError?, user: User?) -> ())?) {
        FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "email, name"], HTTPMethod: "GET").startWithCompletionHandler { (requestConnection, result, error) in
            if error == nil {
                guard let resultDictionary = result as? [String : AnyObject] else { return }
                guard let email = resultDictionary["email"] as? String else { return }
                guard let id = resultDictionary["id"] as? String else { return }
                guard let name = resultDictionary["name"] as? String else { return }
                getFacebookProfileImage(id, completion: { (image, error) in
                    if error == nil {
                        let user = User(facebookName: name, facebookID: id, facebookEmail: email, facebookProfileImage: image)
                        completion?(error: nil, user: user)
                    }
                })
            } else {
                print(error.localizedDescription)
                completion?(error: nil, user: nil)
            }
        }
    }

    private static func getFacebookProfileImage(userID: String, completion: ((image: UIImage?, error: NSError?) -> ())) {
        guard let facebookProfileImageURL = NSURL(string: "https://graph.facebook.com/\(userID)/picture?type=large") else { return }
        print(facebookProfileImageURL)
        let sdImageManager = SDWebImageManager.sharedManager()
        sdImageManager.downloadImageWithURL(facebookProfileImageURL, options: .AvoidAutoSetImage, progress: nil) { (image, error, cachedType, bool, url) in
            if error == nil {
                completion(image: image, error: nil)
            } else {
                completion(image: nil, error: error)
                print(error.localizedDescription)
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接