개발환경 구축/플랫폼 및 서비스관련

유니티에서 페이스북 로그인 (안드로이드)

codehunter 2023. 4. 22. 18:12

기본이 되는 글은 

https://80000coding.oopy.io/53ee65b5-38f1-4c51-9ff0-c30004c0c1b0 

이걸 참조했다.

 

text 세팅, 해시키 세팅만 되면 로그인 처리는 금방되는데 요 2개에서 의외로 시행착오가 많이 나온다.

 

개발환경

OS : 윈도우 

유니티 : 2021.3.16f1 (2023년 4월 현재 필자가 제일 많이 쓰는 버전)

(맥에서는 유니티 2021 실리콘버전은 안드로이드 빌드가 안되는 경우가 있음, 2021 인텔 버전으로)

페이스북 SDK : v16.0

참고로 밑에서 SDK조건을 보면 나오지만 현재 Facebook SDK(v16.0.0)는 유니티 2019.4.39 이상에서 개발하라고 나온다.

 

그런데 여러가지 버전을 테스트 해 본 결과 (빈 프로젝트를 안드로이드 빌드만 수행해 봄)

- 유니티 2021.3.16f1 + Facebook SDK 15, 16 이상은 별다른 에러없이 안드로이드 빌드가 잘되는걸 확인할수 있다.

Facebook SDK 14이하는 임포트하려고 하면 자동으로 업데이트할거냐고 물어보는 창이 뜬다.  

맨 왼쪽걸 선택하고 진행하면 페이스북 세팅 인스펙트화면에서 아래와 같은 경고 메세지도 뜨는데 

역시 무시하고 일단 빌드를 해보면 APK까지는 일단 나오기는 한다.

 

- 유니티 2019.4.40f1 + Facebook SDK 11 이하는 자잘한 에러(빌드에 영향을 안주는)가 있지만 대체로 안드로이드 빌드가 잘된다.

 

- 유니티 2019.4.40f1 + Facebook SDK 12 첫빌드시 같은 이름의 dll이 있다고 에러가 나지만 빌드할 플랫폼에 

맞지않는 dll 폴더나 파일을 삭제하면 빌드가 잘된다.

 

- Facebook SDK 13.2 는 deprecated 라고 떠서 버리는 버전이고

 

결론은 2019.4.40f1 + Facebook SDK 14 이상 으로 빌드를 하게 되면 여러가지 에러가 발생한다. 어떻게든 수정을 할수는 있지만 Facebook SDK를 15이상을 써야 한다면 최신버전 유니티를 사용하는게 작업하는데 있어서 합리적이다. (유니티 2020은 테스트를 안해봤다.)

 

1. 페이스북 개발자 사이트에서 개발자등록 및 앱 등록

이젠 메타 개발자 사이트이지만 아무튼 Facebook for Developers 사이트에서 개발자 계정을 생성하고, 앱 등록을 한다.

이때 앱 등록후 아래와 같은 값들이 필요하다고 한다.

  • App ID
  • App Secret
  • App Token (Client Token)
  • User Token

1-1. 앱 등록

 

1-2. App ID & App Secret Code 얻기

해당 앱의 대시보드 왼쪽에 기본설정을 누르면 바로 확인할수 있다. 이 두 값을 잘 복사해둔다.

 

 

1-3. Client Token & User Token 얻기

여기서 App Token (Client Token)을 얻을수 있다. User Token은 "앱에 권한을 부여해야 합니다" 라는 부분을 클릭하면

 

이렇게 그래프 API 탐색기 화면이 나오는데 여기서 다른건 건드리지 말고 Generate Aceess Token 버튼을 눌러서 나오는 창에서 계속 버튼을 눌러주면 생성된다.

 

최종적으로 UserToken & App Token을 얻은 화면

1-4. 테스터 생성 (그런데 내가 등록할때는 등록할수 없어서 그냥 건너뛰었다.)

 

여기서 이 앱을 자동으로 설치할건지 물어보는 항목에서 예를 선택하면 아래와 같이 버전과 권한설정이 추가된다.

 

여기까지 했으면 일단 내 앱을 페이스북에 등록하는건 1차로 마무리된거다.

 

2. OpenSSL 처리 (이부분은 글 후반부에는 보면 필요없다고 나오는데 해둬도 손해볼건 없다)

본격적인 유니티 개발에 앞서 페이스북에서 안드로이드 해시키를 생성할때 OpenSSL을 요구하는데 먼저 설치하고 들어가보자. (페이스북 SDK 세팅후에 설치해도 상관없다.)

관련내용은 아래 블로그를 참조했다.

https://m.blog.naver.com/zldejs22/221786404571

 

위치는 C:/openssl-3-1.0 으로 하고 버전은 3.1.0 최신버전으로 설치했다.(그냥 압축풀어서 복사만 하면 된다.) 중요한건 패스를 잘 세팅하는것이다. 그거 말고는 특별한건 없다. 그리고 위의 블로그에서 언급한데로 유니티에서 세팅작업후에 거기서 얻은 해시키를 가지고 다시 페이스북 개발자 사이트에서 등록해야 한다.

 

3. 페이스북 SDK 다운받아 유니티에 적용하기

Facebook SDK for Unity

https://developers.facebook.com/docs/unity

위 사이트에서 SDK를 받아서 세팅

 

페이스북 SDK v16.0.0 은 2023.4.22 현재 유니티 2019.4.39f1 이상이 필요하다고 한다. 자세한건 위에 써 놨으니 패스

페이스북 SDK를 임포트후에 유니티 상단에 Facebook > Edit Settings를 선택하면 우측 프로퍼티에 아래와 같은 설정창이 

뜬다.

 

4. Android 빌드 세팅 및 테스트

여기서 App Name 에 앱 이름을 적어주고 Face App ID 에 페이스북 개발자 사이트에서 얻은 앱 ID를 적어주면 된다. 일단 이 2개만 세팅하면 큰 에러없이 안드로이드 빌드까지는 된다.

 

페이스북 SDK 폴더에 보면 Examples라는 폴더가 있는데 여기서 해당 빌드 플랫폼에 맞는 폴더로 이동해서 테스트를 해볼수 있다. 안드로이드 세팅을 테스트해보려면 Example > Mobile > MainMenu를 실행하면 아래와 같은 화면이 나오고

4-1. FB.init 버튼 클릭해서 초기화

4-2. Classic Login 버튼 선택하면

유저 토큰을 입력하는 화면이 나오는데 여기에 위에서 얻은 유저 토큰을 입력하고 Send Success 버튼을 클릭하면 화면과 같이 상태창에 성공이 뜨게 된다. 로그를 자세히 보고 싶어 Log 버튼을 누르면 에러가 뜨게 되는데 해당 씬을 로드 못해서 나오는 에러이므로 빌드 세팅화면에서 Mobile 폴더 있는 씬을 모두 추가 시켜준다음 다시해보면 로그 화면도 볼수 있다.

4-3. 로그가 실패로 나오면 유저토큰이 만료되서

그런것이므로 페이스북 개발자 사이트 > 도구 > 액세스 토큰 도구에서 유저토큰을 새로 얻어서 로그인을 하면 된다.

 

5. 안드로이드 빌드후 테스트

 

이제 본격적으로 페이스북 연습용 프로젝트를 제대로 세팅하고 시작하자.

 

작업하기 앞서 몇가지 선행 작업이 필요한데 먼저 요즘 유니티 버전은 문자 작업을 할때 UGUI Text 보다는 기본이 TextMeshPro로 바뀌었는데 이게 기본 폰트는 한글이 안되는 문제가 있다. 

그래서 https://dwemdwem.tistory.com/1

이런 블로그들을 참조해서 한글 출력부터 기본 세팅후에 작업해야 한다. (의외로 해보면 잘 안되는 블로그 글들이 많다 핵심은 폰트 생성시 Character Set 범위를 맞춰줘야 한다.)

그 다음 안드로이드 세팅을 하고 (이때 user.keystore를 저장하는 위치를 잘 기억해두고)

페이스북 세팅을 하고

간단한 UI 버튼과 메세지를 볼수 있게 세팅을 하고 아래 GameManager 스크립트를 세팅한다. 

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

using Facebook.Unity;
using UnityEngine.UI;
using TMPro;
using System.Text;

public class GameManager : MonoBehaviour
{
    public TextMeshProUGUI txMsg;

    private void Awake()
    {
        if (!FB.IsInitialized)
        {
            FB.Init(InitCallback, OnHideUnity);
        }
        else
        {
            FB.ActivateApp();
        }
    }

    private void InitCallback()
    {
        if (FB.IsInitialized)
        {
            FB.ActivateApp();
            txMsg.text = "페이스북 초기화!";
        }
        else
        {
            Debug.Log("Failed to Initialize the Facebook SDK");
        }
    }

    private void OnHideUnity(bool isGameShown)
    {
        //facebook 로그인 과정에서 시간을 멈추는 역할
        if (!isGameShown)
        {
            Time.timeScale = 0;
        }
        else
        {
            Time.timeScale = 1;
        }
    }

    private void SignWithFacebook()
    {
        // 접근 권한을 얻을 항목들
        var perms = new List<string>() { "public_profile", "email" };

        FB.LogInWithReadPermissions(perms, AuthCallback);
    }

    private void AuthCallback(ILoginResult result)
    {
        StringBuilder sb = new StringBuilder();
        if (FB.IsLoggedIn)
        {
            var token = Facebook.Unity.AccessToken.CurrentAccessToken;

            sb.Append("UID: " + token.UserId + "\n");
            Debug.Log("UID: " + token.UserId);

            sb.Append("Access Token: " + token.TokenString + "\n");
            Debug.Log("Access Token: " + token.TokenString);

            foreach (string perm in token.Permissions)
            {
                // 접근 권한이 있는 항목들
                sb.Append("perm: " + perm + "\n");
                Debug.Log("perm: " + perm);
            }

            txMsg.text = sb.ToString();
        }
        else
        {
            Debug.Log("User cancelled login");
        }
    }

    public void OnClickLogin()
    {
        SignWithFacebook();
    }
}

에디터에서 간단히 테스트해보고

버튼을 클릭하고 유저 액세스 토큰을 찾아서 넣고

 

Send Success 버튼을 누르면

이렇게 로그인 결과가 잘 나오는걸 확인할수 있다. 이제 APK로 빌드를 하고 에뮬레이터에서 테스트해보면

로그인 버튼 누르고 페이스북 로그인 하고 나서 이런 에러메세지가 나오는데 해시키가 등록이 안되어서 그런것이다.

페이스북 개발자 사이트에서 몇가지 내용을 유니티에 있는 내용으로 등록해줘야 한다.

 

아래에서 필요한 내용은 유니티의 페이스북 세팅화면에 다 나와 있다.

페이스북 개발자 사이트 > 내 앱 > 등록한 앱 > 설정 > 기본 설정

위 내용만 채워도 패키지 이름 항목같은데서 에러가 보이면 기본설정화면의 오른쪽의 빠른 시작을 눌러서 내 앱을 간단히 등록하고 다시 와보면 에러가 없어져 있는걸 볼수있다.

 

이제 내 앱이 페이스북에 공식적으로 등록되어 있는 상태이고 다시 에뮬레이터로 와서 앱을 껐다 다시 켜서 로그인을 해보면 이제 에러메세지가 달라졌는데 키 해시가 틀리다고 나온다. 

 

관련내용은 https://developers.facebook.com/docs/android/getting-started?locale=ko_KR 요기 참조

이 문서의 하단에 보면 아래처럼 설명이 나와있다. 하지만 설명이 제일 잘되어 있는건 아래에 있는 블로그 글이다.

더보기

개발 키 해시 만들기

Facebook은 키 해시를 사용하여 앱과 Facebook 앱 간의 인터랙션을 인증합니다. Facebook 로그인을 사용하는 앱을 실행할 경우 Android 개발 키 해시를 Facebook 개발자 프로필에 추가해야 합니다.

릴리스할 앱 버전에 대해서도 릴리스 키 해시를 생성하고 설정해야 합니다.

OS X 또는 Windows에서 키 해시를 생성하거나 Settings.getApplicationSignature(Context)에서 반환된 값을 사용하여 키 해시를 가져올 수 있습니다. 관련 지침은 샘플 앱 실행을 참조하세요.

릴리스 키 해시 만들기

앱과 Facebook 간의 정보 교환을 인증하려면 릴리스 키 해시를 생성하고 Facebook 앱 ID 내의 Android 설정에 추가해야 합니다. 이렇게 하지 않으면 앱을 스토어에 릴리스했을 때 Facebook 통합이 적절하게 작동하지 않을 수 있습니다.

이전 단계에서 개발 환경에 맞는 키 해시로 Facebook 개발자 설정을 업데이트했어야 합니다.

앱을 공개할 때는 일반적으로 다른 서명으로 개발 환경에 서명합니다. 그러므로 릴리스 키 해시를 만들고 Facebook 앱 ID의 Android 설정에 추가하는 것이 좋습니다.

릴리스 키 해시를 생성하려면 Mac 또는 Windows에서 다음 명령을 실행하여 릴리스 키 별칭과 키 저장소 경로를 대체합니다.

Mac OS에서 다음을 실행하세요.

keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

Windows에서는 다음이 필요합니다.

Java SDK 폴더의 명령 프롬프트에서 다음 명령을 실행합니다.

keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | PATH_TO_OPENSSL_LIBRARY\bin\openssl sha1 -binary | PATH_TO_OPENSSL_LIBRARY\bin\openssl base64

릴리스 키를 처음 만들 때 설정한 비밀번호를 사용해야 합니다.

이 명령에서 28자로 구성된 문자열이 생성됩니다. 이 릴리스 키 해시를 Facebook 앱 ID의 Android 설정에 복사하여 붙여넣습니다.

또한 Facebook 앱 ID의 Android 설정에 Android 패키지의 올바른 패키지 이름과 메인 액티비티 클래스가 포함되어 있는지 확인해야 합니다. 

  

유니티 페이스북 SDK 배포용 키해시 등록방법 . https://rich-informer.tistory.com/27

디버그용 키해시와 배포용 키해시가 틀리다! 유니티 에디터에 있던건 디버그용 키해시이고 배포용 키해시는 위내용으로 만들던지 아니면 에러창에 나와 있는 해시값으로 입력하면 된다.

암튼 블로그대로 실행하고 개발자 사이트에 디버그 키해시(유니티에 있던거) 배포용 키해시를 2개 등록하고 (디버그용  키해시는 없어도 되지만 일단 그냥 놔두었다.) 사실 위에 에러메세지에 나와있는 키값을 그대로 등록해도 되지만 나같은 경우에서 대소문자가 구분이 안되어 계속 틀렸다.

 Assets > AndroidManifest > android:debuggable="false" 로 바꾸고 다시 재 빌드하고 

로그인까지 실행해보면

 

apk로도 로그인이 잘되는걸 확인할수 있다.