로그인 요청에 대한 응답이 없습니다

  • 프로젝트 : ttheroes
  • SDK 버전 : 5.11.2

안녕하세요. 로그인 코드를 다음과 같이 작성했으나, 실행하면 콘솔에는 로그인 기록이 남지만 에디터에서는 Backend LocationProperties Update : True 이후로 아무 것도 진행되지 않고 try & catch로도 잡히는 것이 없습니다. 어떻게 처리해야 할까요?

UnityEngine.Debug.Log($"[{nameof(GameDataHandler)}.{nameof(BackendLogin)}] logging in...");
Backend.BMember.LoginWithTheBackendToken((tokenLoginResult) =>
{
    if (tokenLoginResult.IsSuccess())
    {
        UnityEngine.Debug.Log($"[{nameof(GameDataHandler)}.{nameof(BackendLogin)}] login success with token : {Backend.UserNickName}/{Backend.UID}");
        this.BackendDownload();
    }
    else
    {
        Backend.BMember.GuestLogin("Guest", (guestLoginResult) =>
        {
            if (guestLoginResult.IsSuccess())
            {
                UnityEngine.Debug.Log($"[{nameof(GameDataHandler)}.{nameof(BackendLogin)}] login success as guest : {Backend.UserNickName}/{Backend.UID}");
                this.BackendDownload();
            }
            else
            {
                UnityEngine.Debug.LogError($"[{nameof(GameDataHandler)}.{nameof(BackendLogin)}] login fail : {guestLoginResult}");
                App.Instance.StartCoroutine(this.RetryBackendLogin());
            }
        });
    }
});

안녕하세요 개발자님,
Backend.AsyncPoll() 함수를 호출하고 있는지 확인해 주시면 감사하겠습니다.

추가적으로
프로젝트 정보 확인 시 다음 두 에러가 확인되고 있습니다.

statusCode : 401
errorCode : BadUnauthorizedException
message : bad refreshToken, 잘못된 refreshToken 입니다

statusCode : 401
errorCode : BadUnauthorizedException
message : bad customId, 잘못된 customId 입니다

기존 로그인 하던 계정을 콘솔에서 ‘삭제’ 하셨다면 발생할 수 있는 에러들로,
DeleteGuestInfo 함수를 통해 로컬의 게스트 계정 정보를 삭제하신 후 재시도 해주시기 바랍니다.

앗 말씀해주신 내용이 맞는 것 같습니다. 로그인이 잘 되는 것을 확인하고 해당 계정을 삭제했었습니다. 그런 다음부터 문제가 발생했었고요. Backend.AsyncPoll() 메서드는 매니저를 두어 호출하고 있습니다. 그런데 이 종류의 에러가 콜백으로 반환되지 않는 이유가 있는지요?

문제의 원인이 비동기로 인한 부분인지, 함수 자체의 문제인지 확인이 필요할 것 같습니다.

  1. Backend.Initialize(false)로 초기화하여 비동기 상태에서 호출해보기
  2. 동기 함수를 호출하기

안내드리는 위 내용을 진행하신 후 내용을 공유해주실 수 있을까요?

두 가지를 확인해보았습니다. 먼저 이 포스트에서는 Backend.AsyncPoll() 함수의 실행에 관해서 적겠습니다.

다음은 제가 작성한 BackEndAsyncPollManager.cs 파일입니다. 실행 시 SendQueueThread: Start 로그가 맨 먼저 찍히는 것을 확인했습니다.

public class BackEndAsyncPollManager : MonoBehaviour
{
    [TitleGroup("Dev")]
    [SerializeField] private bool logSendQueue;

    private void Awake()
    {
        UnityEngine.Object.DontDestroyOnLoad(this.gameObject);
        SendQueue.StartSendQueue(this.logSendQueue, this.ExceptionEvent);
    }

    private void Update()
    {
        if (!SendQueue.IsInitialize) return;

        SendQueue.Poll();
        // try
        // {
        //     SendQueue.Poll();
        // }
        // catch (Exception exception)
        // {
        //     UnityEngine.Debug.LogError(exception.Message);                
        // }
    }
    
    private void OnApplicationPause(bool isPause)
    {
        if (isPause)
            SendQueue.PauseSendQueue();
        else
            SendQueue.ResumeSendQueue();
    }

    private void OnApplicationQuit()
    {
        BackEnd.SendQueue.StopSendQueue();
    }

    private void ExceptionEvent(Exception exception)
    {
        Debug.LogError(exception.ToString());
    }
}

상기 컴포넌트 대신 SendQueueMgr.cs 컴포넌트를 사용한 경우에도 경과는 같았습니다.

그 다음으로, 비동기 함수 전반의 문제인지에 관해 테스트한 내용입니다.

동기 초기화 코드는 다음과 같으며, 무사히 초기화 로그가 찍혔고 로그인 단계로 진입했습니다.

var initResult = Backend.Initialize(true, true);
if (initResult.IsSuccess())
{
    this.isInitialized = true;
}
else
{
    App.Instance.StartCoroutine(this.RetryInitialize());
}
TheBackend dll v5.11.2
Server setting success
Backend LocationProperties Update : True

비동기 초기화 코드는 다음과 같으며, 동일한 초기화 로그가 찍혔지만 로그인 단계로 이행하지 못했습니다.

Backend.InitializeAsync(true, false, (initResult) =>
{
    if (initResult.IsSuccess())
    {
        this.isInitialized = true;
    }
    else
    {
        App.Instance.StartCoroutine(this.RetryInitialize());
    }
});
TheBackend dll v5.11.2
Server setting success
Backend LocationProperties Update : True

동기 초기화를 알려주신대로 Backend.Initialize(false, true)로 진행했더니 에러는 발생했지만 다음 단계로 이행되었습니다. 확실히 Backend.AsyncPoll() 메서드의 호출에 문제가 있는 것처럼 보입니다.

UnityException: IsObjectMonoBehaviour can only be called from the main thread.
좋아요 1

전혀 엉뚱한 방식으로 해결했습니다. 명백한 까닭은 알 수 없지만 경험적으로 추측해본 사정은 다음과 같습니다:

  • 저희 프로젝트의 소스는 UI 및 설정 등을 구현하는 서비스 레벨과 인스턴스 팩토리 등을 구현한 프레임워크 레벨로 나뉘어 있습니다. 서비스 레벨 소스는 /Assets 하위에 있지만, 프레임워크 레벨 소스는 별도의 저장소에서 관리되고 유니티 패키지 매니저를 통해 Git 주소로 임포트되어 /Packages 하위에 캐싱됩니다.
  • 이 구성에는 잘 알려지지 않은 심각한 이슈가 있는데, 코드 상의 에러가 없더라도 참조되지 않은 네임스페이스를 포함하면 해당 클래스가 깨지는 경우가 있습니다. 가령 프레임워크 단에서 정의한 각종 매니저 프리팹이나 스크립터블 오브젝트에 이런 이슈가 발생하면 에디터가 제대로 인식하지 못합니다.
  • 또한 유니티 패키지 매니저는 커스텀 패키지의 버전과 해시를 둘 다 체크하지 않는 것으로 보입니다. 커스텀 패키지를 갱신하면서 버전을 수정하지 않으면 이것으로 업데이트로 간주하지 않고 캐시도 갱신되지 않습니다.
  • 이번 경우도 상술한 사정으로 프레임워크에 속한 백엔드 계통 커스텀 매니저가 깨져서 발생한 것으로 보입니다. 프레임워크에 내용없는 변경사항을 만들어 버전을 올리고 패키지 캐시를 강제로 갱신시켰더니 깨진 프리팹이 복구되었습니다.

그래서 현재, 다음 단계로 잘 진입하고 있고 로그인도 잘 되고 있습니다. 후속 이슈가 있기는 하지만, 그 부분은 별도의 쓰레드에서 문의드리겠습니다. 도와주셔서 감사합니다.

좋아요 2