AGENT SKILL

24-login-manager

暂无简介

License 许可
MIT
所属仓库
devwinsoft/devian
最近更新
2026-04-12
Stars
★ 0
Forks
0

03 SKILL.md 正文

24-login-manager — LoginManager

Status: ACTIVE AppliesTo: v10

Purpose

로그인 세션 복구 + 게임 진입용 데이터 초기화 오케스트레이터. AccountManager(인증)와 각 시스템 초기화를 연결하지만, Scene/UI는 제어하지 않는다.

Scope

포함:

  • 런타임 인증 세션 복구 (AccountManager.EnsureRuntimeAuthSessionAsync)
  • 명시 로그인 (AccountManager.LoginAsync)
  • RemoteData 초기화 (RemoteDataManager.InitializeAsync) — 버전 체크 + 서버 UTC
  • 저장 동기화 (SaveDataManager.SyncGameStorageAsync)
  • 충돌 해소 + 재초기화 (ResolveConflictAndInitializeAsync)
  • 초기 상태 판별 (LoginInitializeResult.IsInitial) — 호출자가 InventoryManager.FirstInitAsync를 외부에서 실행
  • 게임 시스템 초기화 (Mission/Achieve/Ad/Push/Shop)
  • 시즌 전환 보상 sync (LeaderboardManager.SyncSeasonTransitionRewardsAsync)
  • 최종 local 저장 (SaveDataManager.SaveGameStorageAsync(false, ...))
  • 구매 진입 인증 보정 (EnsurePurchaseLoginReadyAsync, Android silent Google restore)
  • 결과 반환 (CommonResult)

제외:

  • Scene 전환 (SceneTransManager) 호출
  • UI 표시/버튼 제어 (UICanvas*) 호출
  • 로그인 credential 획득 세부 구현 (AccountManager 소관)

API

  • EnsureRuntimeSessionAndInitializeAsync(CancellationToken ct = default) : Task<CommonResult<LoginInitializeResult>>
    • 앱 시작 시 RemoteDataManager.InitializeAsync를 가장 먼저 호출한 뒤 인증 복구 + 초기화 경로
    • 이전 로그인 정보가 없거나(loginType=NONE) 자동 복구가 불가능하면 로컬 모드 초기화(syncAndInitializeAsync) 결과를 그대로 반환한다.
    • 클라이언트 버전은 내부에서 Application.version → VersionNumber.Parse()로 자동 결정한다.
  • LoginAndInitializeAsync(LoginType loginType, CancellationToken ct = default) : Task<CommonResult<LoginInitializeResult>>
    • 사용자 선택 로그인 시 RemoteDataManager.InitializeAsync 선행 + 초기화 경로
  • ResolveConflictAndInitializeAsync(SyncResolution resolution, CancellationToken ct = default) : Task<CommonResult<LoginInitializeResult>>
    • 충돌 해소 경로에서도 RemoteDataManager.InitializeAsync를 먼저 수행한다.
    • 재초기화 후에도 Conflict면 SAVEDATA_SYNC_RESOLVE_FAILED 실패 반환
  • VersionCheck(CancellationToken ct = default) : Task<CommonResult<VersionCheckResult>>
  • VersionCheckAsync(CancellationToken ct = default) : Task<CommonResult<VersionCheckResult>>
    • 버전 판정 API (RemoteDataManager.InitializeAsync 위임 결과 사용)
    • 클라이언트 버전 SSOT: Application.version (PlayerSettings.bundleVersion)
  • IsPurchaseLoginReady() : bool
    • 현재 Firebase 인증 세션 존재 여부
  • EnsurePurchaseLoginReadyAsync(CancellationToken ct = default) : Task<CommonResult<bool>>
    • 구매 진입 시 인증 세션 보정(필요 시 silent restore)

LoginInitializeResult:

  • SyncState (Success / Initial / Conflict)
  • IsInitial
  • IsConflict
  • VersionResult (Success / RecommendUpdate / ForceUpdate)
  • IsRecommendUpdate, IsForceUpdate
  • LocalDeviceId, CloudDeviceId (Conflict 디버깅 정보)
  • LocalSummary, CloudSummary (SaveRecordSummary)
    • 충돌 시 local/cloud 저장 요약(메타 + payload 해석 결과)

반환 규약:

  • 성공: CommonResult.Success(LoginInitializeResult)
  • 실패: CommonResult.Failure(CommonError, ...)

Fatal / Non-fatal

fatal (실패 반환):

  • 계정 로그인/세션 복구 실패
  • 저장 동기화 실패
  • Resolve 후 재충돌(명시적 resolve 경로)
  • 초기 지급/저장 실패 (호출자 책임)
  • Mission/Achieve/Shop 초기화 실패
  • 최종 저장 실패

non-fatal (로그만 남기고 진행):

  • 강제 업데이트 필요 (VersionResult == ForceUpdate)는 실패가 아니라 성공 결과로 반환된다.
  • 서버 UTC 동기화 실패 (클라이언트 UTC fallback)
  • PurchaseManager.SyncAsync 실패
  • AdsManager.InitializeAsync 실패
  • PushManager.InitializeAsync 실패
  • LeaderboardManager.SyncSeasonTransitionRewardsAsync 실패

Hard Rules

  • LoginManager는 Scene/UI 레이어를 참조하지 않는다.
  • LoginManager 공개 API는 CommonResult 계열만 반환한다.
  • RemoteData 초기화는 로그인 초기화 진입점의 첫 단계에서 수행한다.
  • Manager 초기화 함수 내부에서 SaveData 저장을 수행하지 않고, LoginManager 마지막 단계에서만 local save를 수행한다.
  • 버전 체크/서버 UTC fetch 및 해당 상태(property) 소유는 RemoteDataManager가 담당한다.
  • 인증 상태 판단은 AccountManager를 통해서만 수행한다.
  • Save payload 해석/요약 생성은 LoginManager에서 구현하지 않는다. (SaveDataManager 책임)

Sample Wiring

  • SceneLoading은 부트 시 EnsureRuntimeSessionAndInitializeAsync를 호출한다.
  • UICanvasLoading은 버튼 로그인 시 LoginAndInitializeAsync를 호출한다.
  • Conflict 감지/선택 UI는 Scene/UI 레이어에서 처리하고, 실제 해소는 ResolveConflictAndInitializeAsync를 호출한다.
  • 초기 지급: LoginAndInitializeAsync는 IsInitial 시 InventoryManager.FirstInitAsync + SaveDataManager.SaveGameStorageAsync를 내부 수행한다. EnsureRuntimeSessionAndInitializeAsync / ResolveConflictAndInitializeAsync 호출자는 result.IsInitial을 확인한 뒤 외부에서 직접 수행한다.

Implementation Location (3-path mirror)

  • UPM (정본): framework-cs/upm/com.devian.foundation/Samples~/MobilePackage/Runtime/Login/LoginManager.cs
  • UPM (정본): framework-cs/upm/com.devian.foundation/Samples~/MobilePackage/Runtime/Login/VersionCheckResult.cs
  • Packages (sync): framework-cs/apps/UnityExample/Packages/com.devian.foundation/Samples~/MobilePackage/Runtime/Login/LoginManager.cs
  • Packages (sync): framework-cs/apps/UnityExample/Packages/com.devian.foundation/Samples~/MobilePackage/Runtime/Login/VersionCheckResult.cs
  • Assets/Samples (import): framework-cs/apps/UnityExample/Assets/Samples/Devian Samples/{version}/MobilePackage/Runtime/Login/LoginManager.cs
  • Assets/Samples (import): framework-cs/apps/UnityExample/Assets/Samples/Devian Samples/{version}/MobilePackage/Runtime/Login/VersionCheckResult.cs

Related

04 同仓库更多 Skills