RequestServerSideAccess 문의

  • 뒤끝 SDK 버전 : Base 5.18.3 / Chat 1.3.1
  • 프로젝트명 : 핵 앤 슬래시 키우기

이곳에 물어도 되는건지 모르겠습니다만,

private void ProcessAuthentication(SignInStatus status)
    {
        if (status == SignInStatus.Success)
        {
            PlayGamesPlatform.Instance.RequestServerSideAccess(false, code =>
            {
                googleAuthcode = code;
                StartCoroutine(nameof(StartGoogleLogin));
            });
        }
        else
        {
            // Disable your integration with Play Games Services or show a login
            // button to ask users to sign-in. Clicking it should call
            // PlayGamesPlatform.Instance.ManuallyAuthenticate(ProcessAuthentication).
            Binder.UIManager.NetworkErrorPopupPanel.Show(NetworkErrorType.GoogleLoginFailed, status.ToString());
        }
    }

    private IEnumerator StartGoogleLogin()
    {
        bool hasErrorOccured = false;
        
        // 1. GPGS2 엑세스 토큰
        BackendReturnObject bro = Backend.BMember.GetGPGS2AccessToken(googleAuthcode);
        Binder.MainScreen.Show_LoadingLogText("Getting GPGS access token. [1/5]");
        yield return null;
        if (bro.IsSuccess())
        {
            accessToken = bro.GetReturnValuetoJSON()["access_token"].ToString();
        }
        else
        {
            Binder.UIManager.NetworkErrorPopupPanel.Show(NetworkErrorType.Unknown,
                bro.GetErrorMessage(), $"Status Code: {bro.GetStatusCode()} Error Code: {bro.GetErrorCode()}");
            hasErrorOccured = true;
        }

        if (hasErrorOccured)
            yield break;

PlayGamesPlatform.Instance.RequestServerSideAccess(false, code =>

저 forceRefresh를 true로 해야하는걸까요?
아주 간헐적으로 문제가 일어나는것 같습니다.

안녕하세요 개발자님,
NullReferenceException은 대개 RequestServerSideAccess에서 받은 인증 코드가 null이거나 빈 문자열인 경우,
혹은 이미 사용되었거나 만료된 코드인 상태에서 GetGPGS2AccessToken을 호출할 때 발생하는 것으로 확인됩니다.
false로 호출 시 캐시된 코드를 반환할 수 있으므로, true로 변경하여 시도해보시기 바랍니다.
또한, 빈 문자열에 대한 방어 로직을 함께 추가해주신다면 간헐적으로 발생하는 해당 문제를 해결할 수 있을 것으로 예상됩니다.

좋아요 1

어제 제가 새로운 버전을 라이브에 배포했는데요. (v1.030)
Backend에서 건드린건 PlayGamesPlatform.Instance.RequestServerSideAccess() 에서 forceRefreshToken을 false에서 true로 바꾼것 밖에 없습니다.
근데…
인터넷 연결이 좋지 않거나 간헐적으로 네트웍이 끊겼다가 돌아오면 저 token이 리프레쉬가 되는건지…
저장하려고 할때마다 실패합니다.
어떻게 해야할까요?

실제 루트는

public void OnApplicationPause(bool isPause)
    {
        switch (isPause)
        {
            case true:
                Binder.NotificationManager.Set_Notification();
                if (!Binder.DataManager.IsLocalSave)
                {
                    SendQueue.PauseSendQueue();
                    Save_Sync(); <- 1. 이걸 타고
                }

                break;
            case false:
                AndroidNotificationCenter.CancelAllNotifications();
                if (!Binder.DataManager.IsLocalSave)
                    SendQueue.ResumeSendQueue();
                Binder.ExpeditionManager.Update_Progress();
                Binder.UIManager.SetResolution(Binder.GameSettingsManager.ResolutionIndex);
                break;
        }
    }
public void Save_Sync(bool isFromGameQuitPanel = false)
    {
        if (!loginSuccess || string.IsNullOrEmpty(BackendHiddenResource.GameDataRowInDate))
            return;
        SaveResult res = SaveResult.NothingToSave;
        Binder.DataManager.Save.LastSavedDateTime =
            Util.ToSaveStringUtc(Binder.TimeManager.Get_CurrentDateTime());
        OnlyChangedSaveDataToParam();
        if (saveParam.Count > 1)
        {
            BackendReturnObject bro = Backend.PlayerData.UpdateMyData("UserData",
                BackendHiddenResource.GameDataRowInDate.GetDecrypted(), saveParam);
            if (bro.IsSuccess())
            {
                res = SaveResult.Success;

                if (Binder.UIManager.NetworkErrorPopupPanel.IsOpen &&
                    Binder.UIManager.NetworkErrorPopupPanel.ErrorType == NetworkErrorType.SaveFailed_API)
                    Binder.UIManager.NetworkErrorPopupPanel.Close();
            }
            else
            {
                res = SaveResult.Failed;
                if (!isFromGameQuitPanel)
                    OnFailedToSave(bro.GetMessage()); <- 2. 이걸 탄뒤
            }

            Debug.LogError(res);
        }

        if (isFromGameQuitPanel)
            Binder.UIManager.GameQuitPanel.OnSaveComplete(res);
    }
private void OnFailedToSave(string callbackMessage)
    {
        // 1. 서버 상태 체크
        // 서버가 점검중 => 서버 점검 안내
        BackendReturnObject bro = Backend.Utils.GetServerStatus();
        if (bro.IsSuccess())
        {
            string serverStatusCode = bro.GetFlattenJSON()["serverStatus"].ToString();
            // 0 = 온라인, 1 = 오프라인, 2 = 점검중
            if (serverStatusCode.Equals("1"))
            {
                Binder.UIManager.NetworkErrorPopupPanel.Show(NetworkErrorType.ServerOffline, bro.GetMessage());
                return;
            }

            if (serverStatusCode.Equals("2"))
            {
                Binder.UIManager.NetworkErrorPopupPanel.Show(NetworkErrorType.ServerMaintenance, bro.GetMessage());
                return;
            }
        }
        else
        {
            Binder.UIManager.NetworkErrorPopupPanel.Show(NetworkErrorType.Unknown,
                bro.GetErrorMessage(), $"Status Code: {bro.GetStatusCode()} Error Code: {bro.GetErrorCode()}"); <- 3. 이곳이 마지막으로 실행 되면서 GetStatusCode와 GetErrorCode에 아무내용이 없습니다.
            return;
        }

        // 2. API 실패
        Binder.UIManager.NetworkErrorPopupPanel.Show(NetworkErrorType.SaveFailed_API, callbackMessage);
    }

뒤끝 서버 로그상으로도 update 요청과 관련한 특이 에러는 확인되지 않고 있습니다
GetStatusCode()와 GetErrorCode()에 아무 내용이 없다는 것은 네트워크 요청 자체가 실패했다는 의미일 수 있습니다.

forceRefreshToken을 다시 false로 되돌려 주시고,
RequestServerSideAccess에서 받은 인증 코드가 null이거나 빈 문자열인 경우에 대한 방어 로직을 적용해 주시면 감사하겠습니다.
또한 Save_Sync()에서 네트워크 오류 발생 시 재시도 로직을 추가하시는 것도 고려해 보시면 좋을 것 같습니다.

위의 조치들을 적용하신 후, 네트워크 연결이 불안정한 환경에서 OnApplicationPause를 통한 데이터 저장이 성공적으로 이루어지는지 다시 확인하여 주시면 감사하겠습니다.

네 일단 false로 되돌리겠습니다.

  1. 인증코드 방어 적용되어 있습니다.
if (string.IsNullOrEmpty(googleAuthcode))
        {
            Binder.UIManager.NetworkErrorPopupPanel.Show(NetworkErrorType.GoogleAuthcode,
                "Getting GoogleAuthcode Failed.", $"GoogleAuthcode is {(googleAuthcode == null ? "null" : "empty")}");
            hasErrorOccured = true;
        }
  1. 이부분이 Save 재시도 로직이긴 합니다.
// 2. API 실패
        Binder.UIManager.NetworkErrorPopupPanel.Show(NetworkErrorType.SaveFailed_API, callbackMessage);

Backend.Utils.GetServerStatus(); 이게 아무런 에러로그를 안뱉은게 이상합니다.

좀 더 구체적으로…
accessToken을 false로 해두어서 로그인을 못하는 사람들이 있거나 24시간 게임을 켜놔서
간혹 저 토큰이 만료가 되어 크래시가 나는건지 알고 싶었습니다.

이전 버전에서 false 세팅일때 OnApplicationPause로 인한 데이터저장은 대부분 성공이었습니다.
일단 false 세팅을 다시하고, 저 NetworkErrorPopupPanel.Show()에 로그를 심어보겠습니다.

좋아요 1