所以我试图使用SLRequest获取用户的Facebook个人资料图片。我觉得我已经在整个互联网上搜索无济于事,我的智慧结束了。这就是困境......
代码版本1:
let store = ACAccountStore()
let type = store.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierFacebook)
store.requestAccessToAccountsWithType(type, options: [ ACFacebookAppIdKey: "1437725166510606", ACFacebookPermissionsKey: ["email"] ]) { (granted: Bool, error: NSError!) -> Void in
if granted {
let accounts = store.accountsWithAccountType(type)
if let account = accounts.last as? ACAccount {
let pictureURLString = "https://graph.facebook.com/v2.1/me/picture"
let request = SLRequest(forServiceType: SLServiceTypeFacebook, requestMethod: SLRequestMethod.GET, URL: NSURL(string: pictureURLString), parameters: nil)
request.account = account
request.performRequestWithHandler() { (data: NSData!, response: NSHTTPURLResponse!, error: NSError!) -> Void in
if let imageData = data {
// Save the image
// println("Data size: \(imageData.length)\ndata: \(imageData.description)\nAs string: \(NSString(data: imageData, encoding: NSUTF8StringEncoding))")
data.writeToFile(NSFileManager.defaultManager().profileImagePath(), atomically: true)
}
}
}
}
}
好的,所以这个版本可以运行,但会返回一个非常非常小的配置文件图像版本。我想要一个更大的图像!根据Facebook文档和其他很多人的说法,这样做的方法是指定参数,例如:type = large或width = 120& height = 120但是一旦我这样做,我得到以下错误:
{"error":{"message":"An active access token must be used to query information about the current user.","type":"OAuthException","code":2500}}
当Facebook文档获取个人资料图片(https://developers.facebook.com/docs/graph-api/reference/v2.1/user/picture)时明确说明:
因为个人资料图片在Facebook上一直是公开的,所以这个电话会这样做 不需要任何访问令牌。
许多建议,例如此答案https://stackoverflow.com/a/7882628/1175289,建议使用Facebook ID,而不是" me"在请求中,但是现在我们得到app_scoped_user_id而不是规范的fbId似乎根本不起作用。
编辑:这很好,我只是一块木板! :)为了理智,以下是导致错误的代码:
let store = ACAccountStore()
let type = store.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierFacebook)
store.requestAccessToAccountsWithType(type, options: [ ACFacebookAppIdKey: "1437725166510606", ACFacebookPermissionsKey: ["email"] ]) { (granted: Bool, error: NSError!) -> Void in
if granted {
let accounts = store.accountsWithAccountType(type)
if let account = accounts.last as? ACAccount {
let pictureURLString = "https://graph.facebook.com/v2.1/me/picture?type=large"
let request = SLRequest(forServiceType: SLServiceTypeFacebook, requestMethod: SLRequestMethod.GET, URL: NSURL(string: pictureURLString), parameters: nil)
request.account = account
request.performRequestWithHandler() { (data: NSData!, response: NSHTTPURLResponse!, error: NSError!) -> Void in
if let imageData = data {
// Save the image
// println("Data size: \(imageData.length)\ndata: \(imageData.description)\nAs string: \(NSString(data: imageData, encoding: NSUTF8StringEncoding))")
data.writeToFile(NSFileManager.defaultManager().profileImagePath(), atomically: true)
}
}
}
}
}
正如您所看到的,唯一改变的是在url字符串中添加了?type = large。
如果有人遇到类似的问题,或者知道我做错了什么,那么非常感谢帮助! :)
答案 0 :(得分:1)
由于您在API调用中使用/me/
,因此需要access_token
,因为API并不知道me
是谁。如果将其替换为用户ID,例如
https://graph.facebook.com/v2.1/4/picture?type=large
它应该可以正常工作。
如果您想继续在网址中使用/me/
,只需将用户的access_token
附加到网址,例如:
https://graph.facebook.com/v2.1/4/picture?type=large&access_token=abcdef