안녕하세요.
파이어베이스 FireStore 저장 타이밍이 애매해서 질문 여쭙니다.
참고로 초짜입니다.
void OnApplicationQuit()
{
fm.DataSave(false); //저장
fm.LogOut(); //로그아웃
}
public async void DataSave()
{
if (auth.CurrentUser == null)
{
Debug.Log("auth.CurrentUser == null");
return;
}
Debug.Log("저장 시작");
Dictionary<string, object> userData = new Dictionary<string, object>
{
{ "device_id", gm.device_id},
{ "lastLogin", gm.Time_now },
{ "gold", gm.gold}
};
if (docRef == null) docRef = db.Collection("UserInfo").Document(gm.uid);
try
{
Debug.Log("Firestore 데이터 저장 시도");
await docRef.SetAsync(userData, SetOptions.MergeAll);
Debug.Log("Firestore 데이터 저장 완료");
}
catch (Exception e)
{
Debug.LogError($"Firestore 데이터 저장 실패: {e.Message}");
}
}
작성한 코드입니다. 앱 종료시 저장을 하고 있습니다. (안드로이드)
OnApplicationQuit 에서 async 호출하면 중간에 앱 아예 꺼지면서 끊기는거는 알고 있었지만
저장이 되기는 되더라구요?
물론 로그 찍힌거 보면 await docRef.SetAsync(userData, SetOptions.MergeAll); 이후로는 로그가 안찍힙니다. (데이터 저장 시도 까지만 로그찍힘)
저장 잘 되면 됐지 뭐가 문제냐하면
앱 종료하고 다시 로그인 했을 때 저장이 또 진행됩니다.
버튼 눌러서 수동 저장하는 식으로도 해봤는데 그럴때는 괜찮은거 봐서는
파이어베이스 Auth에서 자체적으로 OnApplicationQuit 에서 실행된 DataSave가 마저 진행이 안됐다고 판단하고 또 보내는것 같아유.
그래서 궁금한건
1. OnApplicationQuit 에서 안정적으로 저장을 끝낼 수 있는 방법이 있는지
2. 1번이 불가능하다면 다른 저장 타이밍이나, 자동저장 꿀팁을 알려주십사..
두가지입니다.
미리 감사합니다.
최적의 타이밍은 유저가 게임 종료할때라고 생각하는데 참 어렵네요.
Task 동기로 실행하도록 하는거 있습니다. 그거 사용하세요
그리고 추가로 말하자면 저기서 저장하는건 좋은 방법이 아님
https://docs.unity3d.com/6000.0/Documentation/ScriptReference/MonoBehaviour.OnApplicationQuit.html
공식
문서에서도 저기서 저장하지 말라고 하고 있음
오 한번 찾아보겠습니다! 진짜 감사합니다
저장할 데이터가 업데이트될 때마다 저장하는 게 좋을 듯