C#/수업내용

2020.08.13. 수업내용 - facebook 연동

dev_sr 2020. 8. 13. 15:55

1. 페이스 북에 가입

2. facebook for developer 에 앱 등록

 

3. 앱 기본설정에서 패키지 이름, 클래스 이름, 키 해시를 적어줘야하는데

 

 

유니티의 페이스북 세팅에서 확인할 수 있음

 

openssl이 없으면 해시값이 안보임

여기서 윈도우 용으로 다운받고

https://sourceforge.net/projects/openssl/

 

압축을 C: 에다 풀어줌

그리고 bin폴더까지 환경변수 설정을 해주고

config파일까지 만듦

 

https://blog.naver.com/PostView.nhn?blogId=baekmg1988&logNo=221454486746

 

[Windows] 윈도우에서 OpenSSL 설치하는 방법

프로젝트 중 apache에 인증서를 적용하기 위해 인증서 요청을 했는데 윈도우 IIS에서 사용되는 키와 인...

blog.naver.com

 

 

설치되면 이렇게 나오는데 

 

유니티 껐다 켜면 보여야하지만 안보여서

 

커맨드에

keytool -exportcert -keystore "키스토어까지 경로" -storepass android -keypass android | openssl sha1 -binary | openssl base64

입력해주면 키해시값이 나옴 (마지막 = 까지 28자)

그걸 입력해줌

 

4. 빌드 세팅에 이 씬들을 등록하는데 mainmenu를 가장 위에 놓음

main menu 를 실행하고

FB. Init을 눌러줌

그리고 로그인이 활성화되면 로그인을 눌러줌

 

find access token 을 눌러줌

 

그러면 유저 토큰과 앱 토큰을 얻을 수 있는데 (페북 계정 새로 판 유저는 1시간 기다려야함 ...ㅠㅠ)

유저 토큰에서 오른쪽 끝 디버그버튼을 누르면 토큰을 전부 볼 수 있음

그걸 복사해서 

user access token에 붙여주고 send success를 누름

 

아까 그 main 화면에서 맨위 로그에 success가 나옴

이러면 로그인 준비가 된거임

 

 

전체 코드

 

페이스북 로그인, 로그아웃, 프로필 이름, 프로필 사진 가져오기

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour
{
    public Button btnSignIn;
    public Button btnSignOut;
    public Text text;
    public Text username;
    public Image userimage;

    // Start is called before the first frame update
    void Start()
    {
        FBManager.GetInstance().Init();
        this.btnSignIn.onClick.AddListener(() =>
        {
            FBManager.GetInstance().SignIn((result) =>
            {
                if(result == FBManager.eSignInResult.LOGGED_IN)
                {
                    this.text.text = "facebook 연결";

                    FBManager.GetInstance().GetName((name) =>
                    {
                        this.username.text = name;
                        
                    });

                    FBManager.GetInstance().GetPicture((texture) =>
                    {
                        this.userimage.sprite = Sprite.Create(texture, new Rect(0, 0, 50, 50), new Vector2());
                    });
                }
                
            });
        });

        this.btnSignOut.onClick.AddListener(() =>
        {
            FBManager.GetInstance().SignOut();
            this.text.text = "facebook 로그아웃";
            this.username.text = "";
            this.userimage.sprite = null;
        });
    }

  
}

 

 

gpgs랑 비슷하지만 유저 이름과 사진을 가져오려면 graph api 를 알아야한다고 함

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Facebook.Unity;
using Facebook.Unity.Example;
using System;
using Newtonsoft.Json;

public class FBManager
{
    public enum eSignInResult
    {
        LOGGED_IN,
        CANCELLED
    }


    private static FBManager instance;

    private FBManager() { }

    public static FBManager GetInstance()
    {
        if (FBManager.instance == null)
        {
            FBManager.instance = new FBManager();
        }
        return FBManager.instance;

    }

    public void Init()
    {
        if (!FB.IsInitialized)
        {
            // Initialize the Facebook SDK
            FB.Init(InitCallback, OnHideUnity);
        }
        else
        {
            // Already initialized, signal an app activation App Event
            FB.ActivateApp();
        }
    }

    private void InitCallback()
    {
        if (FB.IsInitialized)
        {
            // Signal an app activation App Event
            FB.ActivateApp();
            // Continue with Facebook SDK
            // ...
        }
        else
        {
            Debug.Log("Failed to Initialize the Facebook SDK");
        }
    }

    private void OnHideUnity(bool isGameShown)
    {
        if (!isGameShown)
        {
            // Pause the game - we will need to hide
            Time.timeScale = 0;
        }
        else
        {
            // Resume the game - we're getting focus again
            Time.timeScale = 1;
        }
    }

    public void SignIn(System.Action<eSignInResult> onComplete)
    {
        var perms = new List<string>() { "public_profile", "email" };
        FB.LogInWithReadPermissions(perms, (result)=>
        {
            if (FB.IsLoggedIn)
            {
                // AccessToken class will have session details
                var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;
                // Print current access token's User ID
                Debug.Log(aToken.UserId);
                // Print current access token's granted permissions
                foreach (string perm in aToken.Permissions)
                {
                    Debug.Log(perm);
                }

                onComplete(eSignInResult.LOGGED_IN);   //sign이 되면 callcback을 받음
            }
            else
            {
                Debug.Log("User cancelled login");
                onComplete(eSignInResult.CANCELLED);
            }
        });
    }

    public void SignOut()
    {
        FB.LogOut();
    }

    public void GetPicture(System.Action<Texture2D> onComplete)
    {
        var aToken = AccessToken.CurrentAccessToken;
        var uri = string.Format("{0}/picture", aToken.UserId);
        //12345678123568/picture
        FB.API(uri, HttpMethod.GET, (result) => {
            if (result.Error == null)
            {
                onComplete(result.Texture);

            }
        });
    }

    public void GetName(System.Action<string> onComplete)
    {
        var aToken = AccessToken.CurrentAccessToken;
        var uri = string.Format("{0}/", aToken.UserId);
        FB.API(uri, HttpMethod.GET, (result) => {
            if (result.Error == null)
            {
                var json = result.RawResult;

                var user = JsonConvert.DeserializeObject<res_user>(json);

                onComplete(user.name);

            }
        });
    }

    public class res_user
    {
        public string name;
        public string id;
    }
}

 

로그인하면 로그인한 계정의 사진 / 이름 이 보임