Получить информацию и изображение с аутентификацией Facebook - SWIFT FacebookSDK - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь что-то узнать о Swift и Facebook. Я интегрировал SDK вручную, без использования модулей, и пока все в порядке! Я создал кнопку входа в систему, следуя некоторым онлайн-руководствам, и это тоже работает! С помощью этого кода, расположенного во ViewController, я также могу напечатать Id, First_Name, Last_Name и получить информацию ProfilePicture:

import UIKit
import FBSDKCoreKit
import FBSDKLoginKit

class ViewController: UIViewController, FBSDKLoginButtonDelegate {

    func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
        if (error == nil) {
            print("Connected")
            let r = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,first_name,last_name,picture.type(large)"], tokenString: FBSDKAccessToken.current()?.tokenString, version: nil, httpMethod: "GET")

            r?.start(completionHandler: { (test, result, error) in
                if(error == nil)
                {
                    print(result as Any)
                }
            })
        } else
        {
            print(error.localizedDescription)
        }
    }
    func loginButtonWillLogin(_ loginButton: FBSDKLoginButton!) -> Bool {
        return true
    }

    func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {
        print("Disconnected")
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let loginButton = FBSDKLoginButton()
        loginButton.readPermissions = ["public_profile", "email"]
        loginButton.center = self.view.center
        loginButton.delegate = self
        self.view.addSubview(loginButton)
    }


}

OutPut это:

Optional({
    email = "cxxxxxxxxx2@live.it";
    "first_name" = Cxxxxxe;
    id = 10xxxxxxxxxxxxx75;
    "last_name" = Lxxxxxo;
    picture =     {
        data =         {
            height = 200;
            "is_silhouette" = 0;
            url = "https://platform-lookaside.fbsbx.com/platform/profilepic/?asid=10xxxxxxxxxxxxx75&height=200&width=200&ext=1565467901&hash=AeQ-NalWNEMh91CK";
            width = 200;
        };
    };
})

Теперь я не знаю, как извлечь единственную информацию, такую ​​как first_name, в переменную, чтобы иметь возможность напечатать ее в метке или взять URL-адрес изображения, чтобы напечатать его в приложении.

если я попытаюсь изменить функцию входа в систему следующим образом:

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
        if (error == nil) {
            print("Connected")
            let r = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,first_name,last_name,picture.type(large)"], tokenString: FBSDKAccessToken.current()?.tokenString, version: nil, httpMethod: "GET")

            r?.start(completionHandler: { (test, result, error) in
                if(error == nil)
                {
                    print(result!["first_name"] as Any)
                }
            })
        } else
        {
            print(error.localizedDescription)
        }
    }

компилятор говорит мне: «Значение типа« Любой »не имеет индексов».

Как я могу это сделать?

Спасибо;)

Ответы [ 3 ]

0 голосов
/ 12 июля 2019

Я создал ярлыки и сейчас решил это следующим образом:

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
    if (error == nil) {
        print("Connected")
        let r = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,first_name,last_name,picture.type(large)"], tokenString: FBSDKAccessToken.current()?.tokenString, version: nil, httpMethod: "GET")

        r?.start(completionHandler: { (test, result, error) in

            if let id : NSString = (result! as AnyObject).value(forKey: "id") as? NSString {
                print("id: \(id)")
                self.lbl_fbid.text = "ID: \(id)"
            }
            if let first_name : NSString = (result! as AnyObject).value(forKey: "first_name") as? NSString {
                print("first_name: \(first_name)")
                self.lbl_fbdirstname.text = "First_Name: \(first_name)"
            }
            if let last_name : NSString = (result! as AnyObject).value(forKey: "last_name") as? NSString {
                print("last_name: \(last_name)")
                self.lbl_fblastname.text = "First_Name: \(last_name)"
            }
            if let email : NSString = (result! as AnyObject).value(forKey: "email") as? NSString {
                print("email: \(email)")
                self.lbl_fbemail.text = "Email: \(email)"
            }
        })
    } else
    {
        print(error.localizedDescription)
    }
}

Теперь мне просто нужно выяснить, как сделать снимок профиля ...

0 голосов
/ 12 июля 2019

Все сделано ... если кому-то нужен код, я написал это:

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {

        if (error == nil) {
            print("Connected")
                        let r = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,first_name,last_name,picture.type(large)"], tokenString: FBSDKAccessToken.current()?.tokenString, version: nil, httpMethod: "GET")
                        r?.start(completionHandler: { (test, result, error) in
                        if let id : NSString = (result! as AnyObject).value(forKey: "id") as? NSString {
                            print("id: \(id)")
                            self.lbl_fbid.text = "ID: \(id)"
                        }
                            if let imageURL = (((((result! as AnyObject).value(forKey: "picture")) as AnyObject).value(forKey: "data")) as AnyObject).value(forKey: "url") as? NSString{
                            print("img url: \(imageURL)")
                            let url = URL(string: imageURL as String)
                            DispatchQueue.global().async {
                                let data = try? Data(contentsOf: url!)
                                DispatchQueue.main.async {
                                    self.img_fbprofilepic.image = UIImage(data: data!)
                                }
                            }
                        }
                        if let first_name : NSString = (result! as AnyObject).value(forKey: "first_name") as? NSString {
                            print("first_name: \(first_name)")
                            self.lbl_fbdirstname.text = "First_Name: \(first_name)"
                        }
                        if let last_name : NSString = (result! as AnyObject).value(forKey: "last_name") as? NSString {
                            print("last_name: \(last_name)")
                            self.lbl_fblastname.text = "First_Name: \(last_name)"
                        }
                        if let email : NSString = (result! as AnyObject).value(forKey: "email") as? NSString {
                            print("email: \(email)")
                            self.lbl_fbemail.text = "Email: \(email)"
                        }

                            if(error == nil)
                            {
                                print(result as Any)
                            }

                        })

        } else  {
            print(error.localizedDescription)
        }
    }
0 голосов
/ 12 июля 2019

в результате вы должны поставить

result.user 

и этот объект содержит свойства, такие как displayName или firstName для этого вопроса

...