在 iOS Facebook SDK 中获取并显示用户的头像
Posted
技术标签:
【中文标题】在 iOS Facebook SDK 中获取并显示用户的头像【英文标题】:Getting and displaying a user's profile picture in the iOS Facebook SDK 【发布时间】:2020-01-22 11:56:46 【问题描述】:我正在使用 Facebook 的 SDK 来允许用户登录我的应用程序,我希望该应用程序显示用户的个人资料图片。我有以下情节提要和 Swift 文件:
Main.storyboard & ViewController.swift
HomeAfterLogIn.storyboard & HomeAfterLogInViewController.swift
“Main”包含用户登录的视图控制器,用户登录的代码如下:
import UIKit
import FacebookLogin
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
if AccessToken.current != nil
// Already logged-in
// Redirect to Home View Controller
goToHome()
// Add LoginButton
let loginButton = FBLoginButton(permissions: [ .publicProfile, .email, .userFriends ])
let screenSize:CGRect = UIScreen.main.bounds
let screenHeight = screenSize.height // real screen height
//let's suppose we want to have 10 points bottom margin
let newCenterY = screenHeight - loginButton.frame.height - 20
let newCenter = CGPoint(x: view.center.x, y: newCenterY)
loginButton.center = newCenter
view.addSubview(loginButton)
// Triggered after every successfully login / logout
NotificationCenter.default.addObserver(forName: .AccessTokenDidChange, object: nil, queue: OperationQueue.main) [weak self] _ in
if AccessToken.current != nil
// Successfully just Logged in
// Redirect to Home View Controller
self?.goToHome()
else
// Successfully just Logged out
func goToHome()
let storyboard = UIStoryboard(name: "HomeAfterLogIn", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeAfterLogInViewController") // I called mine like that (check screenshot below)
self.navigationController?.pushViewController(vc, animated: true)
此代码显示了使用 Facebook 登录按钮以及用户是否成功登录
func goToHome()
将用户发送到 HomeAfterLogIn.storyboard,这是我希望显示用户个人资料图片的地方。
我在 Facebook 的 Graph API 网站上找到了这段代码:
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
initWithGraphpath:@"/100046232170264/picture"
parameters:@ @"redirect": @"false",
HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
// Insert your code here
];
上面的值与我的应用有关。当我将此代码插入我的 HomeAfterLogInViewController.swift 文件时,只会产生以下错误:
我输入的代码有误吗?它是 Swift 的早期版本吗,我的是 swift 4 还是 5?这是我第一次使用 Facebook SDK。
cmet 发布后
(Keshu R.) 将 obj-c 转换为 Swift:
let request = FBSDKGraphRequest(graphPath: "/100046232170264/picture", parameters: [
"redirect": "false"
], httpMethod: "GET")
request.start(withCompletionHandler: connection, result, error in
// Insert your code here
)
(Karol Zmysłowski) 代码错误:
(Keshu R.) HomeAfterLogIn.storyboard 中的 UI 项:
【问题讨论】:
这不是之前的 Swift 版本。您复制的代码是目标 C :) 啊,好吧!这是一个巨大的帮助,有没有办法将它转换为swift? 您是否将响应数据保存在任何地方?显示代码 我拥有的所有代码都在上面显示。我还添加了从 obj-c 转换为 swift 的代码,你觉得呢? 【参考方案1】:import FacebookCore
import FacebookLogin
Profile.loadCurrentProfile(completion: profile, error in
if let profile = profile
let imageURL = profile.imageURL(forMode: .square, size: CGSize(width: 200.0, height: 200.0))
)
【讨论】:
这给了我 1 个错误和 1 个警告。错误是:在顶层不允许使用表达式,这在以 Profile.load ... 开头的行上,警告是:从未使用过不可变值“imageURL”的初始化;考虑替换为“_”的赋值或删除它,这在以 let imageURL 开头的行上【参考方案2】:我建议创建一个自定义按钮并为其添加操作
// import
import FBSDKCoreKit
import FBSDKLoginKit
class LoginVC : UIViewController
// create an IBAction and call the function inside it
@IBAction func facebookLoginBtnPressed(_ sender : Any)
fetchFacebookFields()
// this function will return all the details and you can store it in userdefaults
func fetchFacebookFields()
LoginManager().logIn(permissions: ["email","public_profile"], from: nil)
(result, error) -> Void in
if let error = error
print(error.localizedDescription)
return
guard let result = result else return
if result.isCancelled return
else
GraphRequest(graphPath: "me", parameters: ["fields" : "first_name, last_name, email"]).start()
(connection, result, error) in
if let error = error
print(error.localizedDescription)
return
if
let fields = result as? [String:Any],
let userID = fields["id"] as? String,
let firstName = fields["first_name"] as? String,
let lastName = fields["last_name"] as? String,
let email = fields["email"] as? String
let facebookProfileUrl = "http://graph.facebook.com/\(userID)/picture?type=large"
print("firstName -> \(firstName)")
print("lastName -> \(lastName)")
print("email -> \(email)")
print("facebookProfileUrl -> \(facebookProfileUrl)")
APPDELEGATEOBJ.makeRootVC(vcName : "MainTabBarVC")
【讨论】:
这个放在什么 .swift 文件里?是 HomeAfterLogInViewController.swift 吗?我是否必须添加任何 UI 元素,例如 UIImageView?我将更新我的问题以显示我的 HomeAfterLogIn.storyboard 需要在 loginViewController 中添加。您需要添加一个按钮,然后将facebookLoginBtnPressed
IBAction 连接到您的按钮。
能把图片弄到我能完全理解的地方吗?感谢您的帮助以上是关于在 iOS Facebook SDK 中获取并显示用户的头像的主要内容,如果未能解决你的问题,请参考以下文章
Facebook SDK 错误 Domain=com.facebook.sdk Code=5 在 ios 中获取好友列表时