겨울팥죽 여름빙수
article thumbnail

현재 FireBase Firestore를 이용해 유저의 데이터를 저장하고 있다. 그런데 [앱 삭제 후 재설치], [앱 업데이트 시] 일부 유저에게서 데이터가 롤백되는 현상이 발견되었다. 다행히 내 폰에서도 발생해, 여러가지 테스트가 가능했다.

 

[앱 삭제 후 재설치 시, 나타나는 문제 현상]

- 대략 2~3일정도로 데이터가 롤백됨.
- Firestore 서버에서 데이터를 완전히 다 삭제해도, 접속 시 복구 됨.
- 그냥 앱 종료 후, 접속 시에는 문제 없음.
- 본인은 플레이스토어에서 설치 시에만 발생했지만, 일부 유저는 apk를 직접 다운받아 설치하는 경우에도 발생함.
- 앱 내 소스코드 어디에서도, 클라이언트 단말에 저장하는 기능은 없음.

 

 위 현상에서 유추 했을 때, 

1. 유저의 데이터가 어딘가에 자동으로 저장되고,

2. 앱 삭제 후 재설치나 업데이트 시, 데이터가 복구

3. 복구 된 데이터가 firestore 서버 데이터를 덮어씀(내가 직접 덮어쓰는 코드는 없었음)

 

위 이슈를 해결하기 위해 아래와같이 조치했다.

 

 

1. 안드로이드 자동 백업 기능 끄기

안드로이드 6 버전부터, Manifest에 명시 하지 않으면, 자동으로 데이터를 백업한다고 한다. 따라서 Manifest에 아래와 같이 추가하자. 

 

<application
        android:allowBackup="false"
        android:fullBackupContent="false"
        tools:replace="android:allowBackup">

 

우선 유니티의 경우, Player세팅 -> Custom Main Manifest를 체크하고,  <application> 태그 내에, allowBackup을 false로 하는 코드를 넣자.

 

위 기능을 추가하고, 내 폰에서 테스트 했을 때는, 문제가 해결됐었지만,  여전히 일부 유저폰에서는 이슈가 계속 발생했다.

 

 

2. Firestore PersistenceEnabled 기능 끄기

 Firestore의 PersistenceEnabled (오프라인 지속성)기능은 인터넷이 불안할 때를 대비해, 내부에 유저 데이터를 캐싱해 두고, 인터넷이 불안한 경우, 캐싱 데이터로 읽고 사용하다가, 인터넷이 연결되면, 캐싱 데이터를 서버로 전송하는 기능이다.

 가이드 문서를 읽어보고, 여기서 문제가 발생했다라는 것을 직감했다.

현재 내 핸드폰은 인터넷이 완전히 잘 되고 있는 상황임에도,

[앱 삭제 후 재설치] 시, 캐싱 데이터를 읽고, 서버로 덮어써버리는 현상(구글 firebase firestore의 버그 같음..)

이라고 유추했다. 아마 앱을 삭제해도 캐싱된 데이터는 어딘가에 저장이 되는것 같다.

때문에 앱 시작 시, PersistenceEnabled를 끄는 코드를 추가했다.

FirebaseFirestore.DefaultInstance.Settings.PersistenceEnabled = false;

 

 이 조치 후, 모두 잘 처리 되는 것 같았다. 대신 이제는 비행기 모드에서 앱 사용이 불가능하다. 만약 [firestore의 오프라인 지속성]을 계속 사용할 예정이라면,  아래와 같이 캐싱된 데이터인지 판단해 처리하는 것이 좋을 것 같다.

if(snapshot.Metadata.IsFromCache)
{
	//캐시로부터 불러온 데이터인 경우 처리
    
}
else
{
	//서버로부터 불어온 경우 처리
}

 

profile

겨울팥죽 여름빙수

@여름빙수

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!