매치 시즈에 광고를 붙이고 스토어에 올릴 준비를 했습니다. 규칙은 하나도 안 건드렸고 게임 바깥만 만졌습니다.

광고는 보상형 하나뿐입니다

넣을 수 있는 자리가 여럿인데 하나만 골랐습니다. 하트가 떨어졌을 때 사용자가 스스로 눌러서 보는 자리입니다.

형식안 넣은 이유
보상형 전면자동으로 뜹니다. 하트 충전은 사용자가 고르는 게 맞습니다
전면한 판이 몇 분인데 판마다 끼우면 피로도가 큽니다. 하트 대기와도 겹칩니다
배너세로 화면에 8×8 보드가 꽉 차 있어 넣을 자리가 없습니다
앱 오프닝첫 로딩이 이미 무거운데 그 앞에 광고를 두면 첫인상이 나빠집니다

구조는 예전에 만든 게임에서 그대로 가져왔습니다. 가져온 건 SDK 사용법이 아니라 무효 트래픽을 만들지 않는 구조입니다.

  • 모든 표시가 명시적인 광고 버튼 탭에서만 출발합니다. 앱이 스스로 띄우지 않습니다
  • 탭한 순간에 요청하고 도착하면 바로 보여줍니다. 보여줄 일 없는 요청을 미리 쌓지 않습니다
  • 로드에 실패해도 자동으로 재시도하지 않습니다. 다음 요청은 사용자의 다음 탭을 기다립니다
  • 보상은 광고가 닫힐 때 한 번만 줍니다. 요청하는 자리에서 미리 주면 바로 닫아도 하트가 찹니다

버튼 문구가 스스로 정직해지게도 해 뒀습니다. 광고를 쓸 수 없는 빌드에서는 "하트 충전", 쓸 수 있으면 "광고 보고 하트 충전". 광고 없는 빌드가 광고를 약속하는 일이 구조적으로 생기지 않습니다.

남의 눈에 보이는 이름은 서버가 거릅니다

순위표에 오른 닉네임은 다른 사람 화면에 그대로 뜹니다. 그래서 금칙어 필터를 넣었는데, 앱이 아니라 서버에 뒀습니다. 이유는 둘입니다. 목록을 고칠 때 스토어 심사를 기다리지 않아도 되고, 옛 버전을 쓰는 사람에게도 똑같이 걸립니다.

띄어쓰기·기호·글자 늘이기·대소문자·비슷하게 생긴 글자로 바꿔치기 같은 회피는 정규화로 막습니다. 검사는 35항목입니다.

못 잡는 것도 적어 뒀습니다. 글자 사이에 엉뚱한 글자를 끼워 넣는 회피는 안 잡힙니다. 잡으려면 유사 검색이 필요한데, 그러면 멀쩡한 이름을 막는 일이 급격히 늘어납니다. 일부러 놓아 뒀습니다.

IP는 원문 대신 소금 친 해시로 저장하게 바꿨습니다. 연타를 막으려면 같은 사람인지만 알면 되고, 그게 누구인지는 알 필요가 없습니다. 소금이 없으면 아무것도 저장하지 않습니다.

데이터 삭제 안내도 따로 만들었습니다. 방침 문서에는 없던 "무엇이 얼마나 남는지"를 적었습니다 — 데이터베이스의 시점 복원 때문에 최대 30일입니다.

두 문서 모두 정적 파일이 아니라 서버가 직접 응답합니다. 정적으로 올렸더니 1년 동안 캐시돼서 문서를 고쳐도 안 바뀌는 걸 재 보고 알았습니다. 법적 문서에는 쓸 수 없는 방식이었습니다.

버전 번호는 한 곳에서만 읽습니다

번호를 1.0.1로 올렸습니다. 사연이 있습니다. 스토어는 한 번 올린 빌드 번호를 영구히 예약합니다. 정식 등록을 안 했어도, 올렸다 내려도 그 번호는 다시 못 씁니다. 그래서 1은 죽은 번호가 됐습니다.

더 위험한 건 버전이 세 군데에 흩어져 있었다는 겁니다. 게임이 화면에 그리는 값과, 두 가지 빌드 설정. 한쪽만 올리면 화면에는 1.0.1이라고 뜨는데 실제로 올라간 건 1.0.0인 상태가 되고, 그건 아무도 모른 채 배포됩니다.

그래서 프로젝트 설정 한 곳을 단일 출처로 삼고, 설정 화면도 거기서 읽게 했습니다. 화면에 뜬 버전이 곧 빌드된 버전입니다. 코드에 숫자를 적어 두면 언젠가 빌드와 갈라지고, 그러면 제보를 받아도 어느 빌드 이야기인지 알 수 없습니다. 셋이 어긋나면 빌드 전에 걸리게 검사도 붙였습니다.

그 사이에 첫 기록이 올라왔습니다

순위표에 사람이 올린 점수가 처음 찍혔습니다. 3판, 12,754점. 만든 사람이 직접 낸 기록이라 자랑할 건 아니지만, 판이 끝나고 이름이 서버에 닿아 목록에 뜨는 것까지 실제로 한 바퀴 돌았다는 뜻입니다.

이제 진짜로 남은 건 밸런스입니다. 3판이 적당한 벽인지, 한 판이 지루하지 않은지는 숫자를 더 들여다봐도 안 나옵니다.

이어서 읽을 것

광고 자리를 정하는 일은 화면 구조와 붙어 있습니다. 전체화면과 하단 배너는 같이 쓸 수 없습니다에 왜 둘 중 하나를 포기해야 하는지 적었습니다. 실기기에서만 나온 문제들은 데스크톱에서는 절대 볼 수 없던 결함 둘에 있습니다.