在 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 中获取并显示用户的头像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用iOS SDK在FB中获取用户的所有朋友

Facebook iOS SDK 3.2 获取用户新闻提要

Facebook SDK 错误 Domain=com.facebook.sdk Code=5 在 ios 中获取好友列表时

Facebook iOS SDK:获取专辑封面图片

通过 facebook ios SDK 结合 Azure 移动服务获取名字和姓氏

解析 iOS SDK:无法从数组中获取对象