앱이 이상하다는 문의에 “지우고 다시 깔아 보세요”라고 답했다. 그 뒤에 “진행 상황이 다 없어졌다”는 말이 돌아왔다.
Table of contents
Open Table of contents
저장 위치
진행 상황을 어디에 저장하고 있었는지부터 봤다.
CCUserDefault::sharedUserDefault()->setIntegerForKey("stage", 12);
이게 Android 에서 어디로 들어가는지 CCFileUtils_android.cpp 를 열어 봤다. getWriteablePath() 가 /data/data/ 에 패키지 이름을 붙여 돌려준다.
/data/data/<패키지>/UserDefault.xml
앱 폴더 안이었다. 앱을 지우면 같이 지워진다.
지우고 다시 까는 것은 앱만 새로 까는 것이 아니라 그 앱이 가진 것을 다 지우는 것이었다. 그걸 모르고 안내했다.
안내 문구를 고쳤다
이미 그렇게 한 사람들이 있었고 되돌릴 방법이 없었다. 할 수 있는 것은 다음 사람에게 같은 안내를 안 하는 것뿐이었다.
(이전) 앱을 지우고 다시 설치해 보세요.
(수정) 앱을 완전히 종료한 뒤 다시 실행해 보세요.
그래도 안 되면 문의 주십시오. 재설치는 진행 상황이 지워집니다.
무엇이 없어지는지 모르고 안내한 것이 문제였다. 조치를 안내하기 전에 그 조치가 무엇을 지우는지 먼저 봐야 했다.
서버에도 남기게 했다
진행 상황이 기기에만 있으면 앱을 지울 때뿐 아니라 기기를 바꿔도 없어진다. Android 에는 BackupAgent 로 계정에 올려 두는 길이 있는데, 복원 시점을 우리가 못 정해서 안 골랐다.
void GameData::sync() {
Json::Value body;
body["device_id"] = getDeviceId();
body["stage"] = m_stage;
body["coin"] = m_coin;
HttpClient::post("/api/save", body);
}
다시 깔아도 같은 기기면 받아 올 수 있다. ANDROID_ID 를 기기 이름으로 썼다. 기기를 바꾸면 못 찾는데 그건 계정을 만들어야 하는 이야기다. 그때는 못 했고 대신 무엇이 안 되는지 적어 뒀다.
Environment.getExternalStorageDirectory() 아래에 두는 방법도 봤다. 거기 두면 앱을 지워도 파일이 남는다. 그런데 SD 카드는 FAT 라 권한이 없다. 다른 앱도 읽고 쓴다. WRITE_EXTERNAL_STORAGE 를 받아야 하고 카드가 없는 기기도 있다. 지워도 남는다는 이유 하나만으로 고를 자리가 아니었다.
무엇이 어디에 있는지도 적어 뒀다.
진행 상황(스테이지·코인) UserDefault.xml. 앱 삭제 시 사라짐. 서버에도 올림
설정(소리·진동) UserDefault.xml. 앱 삭제 시 사라짐. 서버에 안 올림
받은 이미지 캐시 cache 폴더. 시스템이 지울 수 있음
적어 두니 “지우고 다시 깔면 무엇이 없어지는가”에 조사 없이 답할 수 있게 됐다.
지워지기 전에 물어보게 했다
같은 눈으로 앱 안을 보니 “초기화” 버튼이 바로 지우고 있었다.
void SettingLayer::onResetClicked() {
GameData::getInstance()->reset();
}
실수로 누르면 끝이다. 확인을 누른 뒤에만 지우게 바꿨다.
이 판에는 물어보는 상자가 없었다. CCLayer 를 하나 더 얹고 CCMenuItemImage 둘을 두는 식으로 만들었다.
void SettingLayer::onResetClicked() {
ConfirmLayer* c = ConfirmLayer::create(
"진행 상황이 모두 지워집니다.", this, menu_selector(SettingLayer::doReset));
addChild(c, 100);
}
덮는 레이어의 CCLayer::setIsTouchEnabled 를 켜서 뒤쪽 버튼이 안 눌리게 했다.
이미 없어진 사람들에게는 복구해 줄 것이 없었다. 대신 문의를 준 사람의 진행 상황을 관리 화면에서 직접 넣어 주는 자리를 만들었다. 누가 언제 무엇을 넣었는지 기록이 남게 했다. 안 남기면 나중에 이상한 값이 나왔을 때 못 찾는다.
정리
- 앱을 지우면
/data/data/<패키지>안의 것도 같이 지워진다 - 무엇이 없어지는지 모르고 “지우고 다시 깔아 보세요”라고 안내하지 않는다
- 조치를 안내하기 전에 그 조치가 무엇을 지우는지 본다
- 기기에만 있는 것은 기기를 바꾸면 없어진다. 서버에도 남긴다
- 지워도 남는 자리가 있지만 그 이유 하나만으로 고를 자리는 아니다
- 되돌릴 수 없는 것 앞에는 물어보는 자리를 둔다
- 무엇이 어디에 저장되는지 적어 두면 물었을 때 조사 없이 답이 나온다