Using Facebook SDK for iOS (Swift 4):
class FacebookSignIn {
enum Error: Swift.Error {
case unableToInitializeGraphRequest
case unexpectedGraphResponse
}
func profileImageURL(size: CGSize, completion: @escaping Result<URL?>.Completion) {
guard let userID = FBSDKAccessToken.current()?.userID else {
completion(.failure(Error.unableToInitializeGraphRequest))
return
}
let params: [String: Any] = ["redirect": 0,
"type": size.width == size.height ? "square" : "normal",
"height": Int(size.height),
"width": Int(size.width),
"fields": "is_silhouette, url"]
guard let request = FBSDKGraphRequest(graphPath: "/\(userID)/picture", parameters: params) else {
completion(.failure(Error.unableToInitializeGraphRequest))
return
}
_ = request.start { _, result, error in
if let e = error {
completion(.failure(e))
} else if let result = result as? [String: Any], let data = result["data"] as? [String: Any] {
if let isSilhouette = data["is_silhouette"] as? Bool, let urlString = data["url"] as? String {
if isSilhouette {
completion(.success(nil))
} else {
if let url = URL(string: urlString) {
completion(.success(url))
} else {
completion(.failure(Error.unexpectedGraphResponse))
}
}
} else {
completion(.failure(Error.unexpectedGraphResponse))
}
} else {
completion(.failure(Error.unexpectedGraphResponse))
}
}
}
}
public enum Result<T> {
case success(T)
case failure(Swift.Error)
public typealias Completion = (Result<T>) -> Void
}