불러오는 중…
서버 진단
실시간 룸
사용자 분석 — 최근 14일
| 날짜 | 사용자(기기) | 게임 사용자 | 실행 세션 | 게임 진입 | 결과 보고 | 내부 검증 | 미분류 | 미식별 세션 |
|---|
빌드별 이용 (14일, 고유 세션)
안전한 값은 둘을 다 만족해야 합니다 — ① 두 스토어가 실제로 배포 중인 빌드 이하(그보다 높으면 사용자가 받을 수 없는 업데이트를 안내받습니다) ② 그 빌드가 이 표에 실제로 나타날 것(단계적 롤아웃이 닿았다는 뜻입니다).
🔴 이 표에는 우리 시험 기기도 섞여 있습니다. 여기 보인다고 스토어에 있는 것이 아닙니다 — 2026-09-09 실측으로 b61 이 양쪽에 있었지만 두 스토어는 b53 이었습니다.
스토어 확인: iOS
itunes.apple.com/lookup?bundleId=kr.co.duoduel.app ·
Android 는 Play 스토어 페이지의 버전(또는 Play Console 의 롤아웃 %).
| 빌드 | 플랫폼 | 사용자(기기) | 고유 세션 |
|---|
사용자(기기) — 그날 활동한 고유 설치 ID 수. 사람 수에 가장 가깝습니다(기기 여러 대·재설치는 따로 셉니다). 기간 합계는 일별 합이 아니라 합집합입니다.
게임 사용자 — 그중 게임 시작이 기록된 기기.
미식별 세션 — 설치 ID 가 없는 세션(설치 ID 를 보내기 전 앱·기록). 사람 수로 추정하지 않습니다.
실행 세션 — 그날 활동 기록이 있던 세션 수. 같은 사람이 여러 번 켜면 여러 번 셉니다.
게임 진입 — 그중 게임 시작이 기록된 세션. 온라인은 로비 진입도 포함될 수 있습니다.
결과 보고 — 대전 결과 «보고» 수. 온라인은 양쪽이 각각 보고하므로 «판 수»가 아닙니다.
내부 검증 — 개발 표식이 붙은 세션. 우리 손이라고 말할 수 있는 것입니다.
미분류 — 나머지. 「실사용자」라는 뜻이 아닙니다 — 우리도 릴리즈 빌드로 검증하고, 표식을 남기기 시작한 - 이전 기록에는 표식 자체가 없습니다.
최근 14일 추이
익명 텔레메트리(활성 세션·게임 진입/종료·플레이·에러)를 날짜별로 집계합니다. 출시 후 "어제보다 늘었나?"·"에러가 갑자기 튀었나?"를 한눈에 봅니다.
활성 앱 세션 (일별 익명 세션 중복 제거)
플레이 (막대 위 숫자 = 그 날 승리 수)
에러
앱 사용 현황 익명 세션 · 개인 식별 없음
불러오는 중…
게임 통계 승/패/무·모드별(익명)
자원 추이 게임을 나갈 때 앱이 직접 잰 값
한 실행에서 게임을 몇 번째로 나갔는지(회차)별 평균이다. RSS 가 회차를 따라 계속 오르면 회수가 안 되는 것이고, 첫 구간만 높고 그 뒤 평탄하면 캐시가 데워진 것이라 정상이다.
클라이언트 에러
최근 발생 상세 항목을 눌러 스택을 확인하세요
위험 작업
전체 통계·오류·광고·앱 활동 로그를 백업 후 초기화합니다.
접근 로그
이 사이트(duoduel.co.kr)에 들어온 HTTP 요청입니다. 대전
WebSocket 은 여기 안 들어옵니다 — 그건 「실시간 룸」에서 봅니다.
기본은 사이트 페이지만 보여줍니다. 앱이 보내는 API 호출
(/log·/wallet 등)과 관리자 화면 요청은
양이 훨씬 많아 섞으면 실제 방문자를 가리므로 왼쪽에서 갈라 봅니다.
개인정보 보호를 위해 IP 는 해시로만 남고, 쿼리스트링·헤더·본문은
기록하지 않습니다(토큰이 실릴 수 있는 자리라 수집 시점에 잘라냅니다).
그래서 여기서 원본 IP 나 파라미터는 볼 수 없습니다.
많이 열린 경로
많이 온 클라이언트
최근 요청
고객 문의
게임 노출 체크 = 홈에서 숨김
피처드 캐러셀 순서
사이트 소유확인 Google Search Console
Search Console 에서 HTML 태그 방식을 고르면 나오는
content="..." 안의 값만 붙여넣으세요. 태그 전체를 넣어도 값만 걸러 저장합니다.
Search Console 열기
공지
게임 밸런스 — 앱 배포 없이 숫자 바꾸기
🔴 이미 하고 있는 경기에는 영향이 없습니다 — 도중에 규칙이 바뀌면 같은 경기에서 두 사람이 다른 규칙으로 놀게 되고, 온라인이면 두 기기가 다르게 판정합니다.
⚠️ 앱이 모르는 이름은 그냥 무시합니다(오타를 넣어도 고장나지 않습니다). 대신 아래 「앱이 버린 이름」에 나옵니다.
예:
"tap_battle.rounds": 5 — 탭배틀 라운드 수를 5로.
비우려면
{} 를 넣으세요. 그러면 앱에 박힌 기본값으로 돌아갑니다.
버전 게이트
스토어 최신 빌드 — 「새 버전이 나왔어요」 권장 안내의 근거값입니다.
위의 최소 빌드는 차단이고, 이 값은 권유라 뜻이 다릅니다.
🔴 iOS 는 이 값이 없으면 안내가 아예 못 뜹니다. Android 는 Play 가 직접
알려 주지만, iOS·사이드로드 설치본에는 물어볼 곳이 없기 때문입니다.
🔴 스토어에 실제로 올라간 빌드 번호만 넣으세요. 없는 번호를 넣으면
사용자가 「업데이트」를 눌러도 받을 것이 없습니다.
값의 모양: 정수 빌드 번호(버전 이름이 아닙니다). 예 67 ·
비우면 끕니다(권장 안내를 하지 않습니다).
어디서 얻나: Play Console → 출시 → 프로덕션 / App Store Connect → 앱 → 빌드.
광고 운영 현황
0
광고 요청0
실제 노출0
리워드 시청 요청0
시청 완료·보상0
클릭0
로드·표시 실패| 형식 | 요청 | 로드 | 노출 | 시청 요청 | 완료·보상 | 클릭 | 실패 |
|---|
최근 광고 이벤트
| 시각 | 형식 | 이벤트 | 위치 | 플랫폼·빌드 |
|---|
광고
모르겠으면 이대로 두세요. 아래 권장 표시가 기본 권장값입니다.
순서: ① 아래 AdMob 광고 단위 ID 3칸을 먼저 채우고 저장 → ② 실기기에서 광고가 뜨는지 확인 → ③ 그 다음 마스터 스위치를 켭니다. ID 가 빈 상태로 마스터를 켜면 테스트 광고가 유저에게 나갑니다(수익 0).
배너
화면 하단에 항상 떠 있는 작은 띠 광고. 수익은 낮지만 거슬림이 가장 적습니다. 권장 ON전면광고
매치가 끝난 뒤 화면 전체를 덮는 광고. 배너보다 수익이 훨씬 크지만 너무 자주 띄우면 이탈·악평·정책 위반으로 이어집니다. 권장 ON (빈도는 아래 두 값으로 조절)AdMob 광고 단위 ID
비워두면 Google 테스트 광고가 나갑니다(수익 없음). 실 ID 를 넣으면 앱 업데이트 없이 즉시 실광고로 전환됩니다.
형식 ca-app-pub-0000000000000000/0000000000 — AdMob > 앱 > 광고 단위에서 복사.
앱 ID(~ 물결이 들어간 값)는 여기가 아니라 앱 빌드에 박혀 있어 여기서 못 바꿉니다.
처음이신가요? ① 앱 목록 → 앱 선택 → 광고 단위 → 광고 단위 추가 → 생성된 광고 단위 ID 복사 → 아래 칸에 붙여넣기 → 저장. 광고 단위 만들기 도움말
AdMob "광고 형식 선택" 화면에서 만들 것은 3개뿐입니다.
배너 전면 광고 보상형 — 이 3개만 각각 1개씩 만드세요.
보상형 전면 네이티브 광고 고급형 앱 오프닝 — 앱이 사용하지 않으므로 만들지 마세요. (특히 보상형과 보상형 전면은 이름이 비슷하니 주의 — 필요한 건 유저가 직접 "광고 보고 2배 받기"를 누르는 보상형입니다.)
AdMob 앱 ID 기록용
여기 저장해도 앱은 바뀌지 않습니다. 앱 ID 는 앱 빌드(AndroidManifest)에 박혀 있고 SDK 가 앱 시작 시 거기서 읽습니다 — 교체하려면 재빌드·재배포가 필요합니다.
그럼에도 여기 적어두는 이유: 값을 한곳에 보관하고, 아래 단위 ID 와 게시자 번호가 어긋났는지 자동으로 검사하기 위해서입니다. 앱 ID 와 단위 ID 의 게시자가 다르면 광고가 한 개도 안 뜹니다(수익 0).
iOS 광고
위 설정은 전부 Android 값입니다. AdMob 은 플랫폼마다 앱을 따로 만들고 광고 단위 ID 가 공유되지 않습니다 — iOS 것을 여기 따로 넣으세요.
앱 ID 와 단위 3칸을 모두 채워야 "iOS 광고 사용"을 켤 수 있습니다. 하나라도 비면 저장이 거부됩니다 — 빈 채로 켜면 앱이 테스트 광고로 폴백해 "광고가 도는 것처럼 보이는데 수익 0" 이 되기 때문입니다.
Info.plist 의 GADApplicationIdentifier 를 읽으므로
실제로 바꾸려면 재빌드가 필요합니다. 현재 빌드는 구글 테스트 ID가 박혀 있습니다.
출시 범위 — 앱이 어떤 기능을 노출하는가
| 기능 | Android | iOS |
|---|---|---|
| 광고 | - | - |
| 계정 연동 (순위표·업적) | - | - |
| 현금 결제 (IAP) | - | |
iOS 게이트
위 iOS 광고 카드가 완성돼야 켤 수 있습니다. ⚠ 켜기 전에 Xcode 에서 Game Center capability 를 추가하고 App Store Connect 에 순위표·업적을 만든 뒤 재빌드해야 실제로 동작합니다. 서버는 그것까지 알 수 없으므로 이 토글만으로는 부족합니다.관련 사이트 바로가기
광고 (AdMob)
스토어 (Google Play)
DuoDuel 공개 페이지
개인정보처리방침·데이터 삭제 URL 은 Play Console 제출용입니다.Play Games 리더보드(순위표)·업적
- Play Console → 사용자 늘리기 → Play Games 서비스 → 설정 및 관리 로 이동
- 리더보드 → 리더보드 만들기: 이름
Total Coins(en-US 필수 — 영어로 입력), 형식 숫자·소수점 0, 정렬 높을수록 상위 → 저장 - 업적 → 업적 만들기: 아래 6개를 각각 만듦(이름은 en-US 필수 — 괄호 안 영어로 입력). "50 Wins"만 증분형(목표 50), 나머지는 표준형
- 각 항목의 ID(
CgkI…형태)를 복사 → 아래 같은 이름 칸에 붙여넣기 → 저장
ID 는 어디서 보나: 만든 리더보드/업적 목록에서 각 항목을 열면 상단에 CgkI… ID 가 있습니다.
비워두면 그 항목은 무시(안전). 로그인한 유저에게만 적용됩니다.
업적 "점수"(포인트) 배분 — 승리 수가 아니라 게이머 레벨용 가치 포인트입니다(계정당 총 2,000, 5~200·5의 배수, 게임 동작과 무관). 게시 후에도 조정 가능. 권장:
| 업적 | 점수 |
|---|---|
| First Win (첫 승리) | 10 |
| 50 Wins (50승) | 50 |
| 7-Day Streak (7일 출석) | 40 |
| Champion (선수권 우승) | 30 |
| First Online Win (온라인 첫 승) | 20 |
| First Purchase (첫 구매) | 25 |
| 합계 | 175 (2,000 이내면 자유) |
리더보드(순위표)
업적 — 아래 6개를 Play Console 에서 만들고 ID 를 각 칸에
① 계정 로그인 — Google Play Games (필수)
유저가 로그인해 다이아·진행도를 서버에 저장하려면 필요합니다. 미설정이면 앱은 게스트(기기 로컬)로만 동작합니다.
- Play Console → 사용자 늘리기 → Play Games 서비스 → 설정 및 관리 → 게임 생성 → 앱 연결(패키지
kr.co.duoduel.app+ 앱 서명 키 SHA-1) → 테스터에 본인 계정 추가 - Google Cloud → 사용자 인증 정보 → OAuth 클라이언트 → 유형 "웹 애플리케이션" 생성 (Android 아님!)
- 생성된 클라이언트 ID + 보안 비밀번호를 아래에 넣고 → 저장 → 연결 테스트
⚠ 웹 유형이어야 합니다(Android 는 비밀번호가 없어 서버 인증 불가). ⚠ SHA-1 은 앱 서명 키(업로드 키 아님) — AAB 를 한 번 올려야 Play Console 앱 서명에 생깁니다.
서버 환경변수로 설정돼 있습니다. 환경변수가 우선이라 여기서 저장해도 적용되지 않습니다.
② 결제 검증 — 서비스 계정 (권장)
없으면 다이아 지급을 앱이 스스로 합니다(루팅 기기에서 부풀리기 가능). 설정하면 서버가 Google 영수증을 확인 후 서버가 정한 금액만 지급합니다.
출시 필수는 아니지만, 유료 상품 보안을 위해 권장합니다.
- Google Cloud → IAM → 서비스 계정 생성 → 키(JSON) 내려받기
- Google Cloud → API·서비스 → 라이브러리 →
Google Play Android Developer API사용 설정 - Play Console → 사용자 및 권한 → 새 사용자 초대 →
이메일에 서비스 계정 이메일 입력 →
"재무 데이터, 주문 및 취소 설문조사 응답 보기" 부여 (DuoDuel 앱만 선택) → 초대
서비스 계정 이메일 = Google Cloud → IAM 및 관리자 → 서비스 계정 목록의 "이메일" 값(=JSON 의
client_email, 아래 칸에 넣는 값과 동일).…@프로젝트ID.iam.gserviceaccount.com형태. - 내려받은 JSON 파일 내용을 그대로 아래 칸에 붙여넣기 → 저장 → 연결 시험
서비스 계정은 서버 전용 신분증이라, 관리자 본인 권한과 별개로 위 권한을 따로 줘야 합니다. 서비스 계정 · API 사용 설정 · Play Console
| 서비스 계정 | - |
|---|---|
| 프로젝트 | - |
| 키 지문 — 다른 앱에 넣은 키와 같은지 대조용 | - |
| 마지막 연결 확인 | - |
iOS 업로드 — App Store Connect API
없으면 iOS 업로드를 손으로 해야 합니다(Xcode Organizer·Transporter). 넣으면 안드로이드처럼 빌드 → 업로드 → TestFlight 를 명령 하나로 돌립니다.
Play 의 서비스 계정과 목적은 같지만 완전히 별개입니다 —
애플은 .p8 키를 씁니다.
- App Store Connect → 사용자 및 액세스 → 통합 → App Store Connect API
- 팀 키 탭에서 + → 이름 입력 → 액세스 권한 App Manager 이상 선택
- Issuer ID(화면 상단 UUID)와 Key ID를 복사
AuthKey_XXXXXXXXXX.p8내려받기 — ⚠ 다운로드는 한 번뿐입니다. 잃어버리면 폐기하고 새로 발급해야 합니다- 내려받은 파일을 텍스트로 열어 내용 전체를 아래에 붙여넣기
- 번들 ID 는 따로 받지 않습니다 — 「② 결제 검증」의 패키지 이름을 그대로 씁니다
App Store Connect API 키 발급 · 나의 앱
| 번들 ID | -
— 「② 결제 검증」의 패키지 이름을 그대로 씁니다(따로 안 받습니다) |
|---|---|
| 키 지문 | - |
| 마지막 연결 확인 | - |
③ 순위표·업적 — Play Games (선택)
재방문을 돕는 순위표·업적입니다. 출시 필수 아님 — 나중에 켜도 됩니다. Play Console 에서 항목을 만든 뒤 그 ID 를 왼쪽 메뉴 "순위표·업적" 화면에 입력하세요.
-
총 결제 건수
-
지급 다이아 합계
-
광고 제거 구매
-
영수증 검증
상품별 판매
| 상품 | 판매 건수 |
|---|---|
| 불러오는 중… | |
최근 결제
영수증 검증에 성공해 실제 지급된 건만 기록됩니다. 환불 문의 시 이 내역과 Play Console 주문을 대조하세요. 게스트(미연동) 구매는 서버를 거치지 않아 여기 없습니다.
| 시각 | 플레이어 | 상품 | 다이아 | 주문 ID |
|---|---|---|---|---|
| 불러오는 중… | ||||
유저 지갑 -
계정 연동이 꺼져 있습니다.
서버에 GOOGLE_OAUTH_CLIENT_ID / GOOGLE_OAUTH_CLIENT_SECRET 이 설정돼야
Play Games 로그인이 동작합니다. 설정 전에는 앱이 기존처럼 기기 로컬에만 저장합니다.
절차는 docs/account_wallet_setup.md.
보정은 감사 로그로 남습니다(누가·언제·왜). 문의 대응으로 지급할 때는 사유를 구체적으로 적어주세요.
| 플레이어 | 코인 | 다이아 | 광고제거 | 코스메틱 | 최근 동기화 | 보정 |
|---|---|---|---|---|---|---|
| 불러오는 중… | ||||||
관리자 충전 내역 -
관리자가 지급/보정한 전 내역(영구 보관). 누가·언제·얼마·왜가 남습니다. 결제(실구매)와는 별개입니다.
| 시각 | 플레이어 | 다이아 | 코인 | 관리자 | 사유 |
|---|---|---|---|---|---|
| 불러오는 중… | |||||
되돌릴 수 없는 것 — 먼저 확인
- 패키지 이름
kr.co.duoduel.app— 확정되면 영구히 못 바꿉니다. - 무료 → 유료 전환 불가 — 게시 후에는 무료 앱을 유료로 못 바꿉니다.
- 기본 언어 한국어(ko-KR) — 나중에 바꾸기 번거롭습니다.
현재 상태
| 플랫폼 | Android — Play 프로덕션 공개(한국) |
|---|---|
| 패키지 | kr.co.duoduel.app |
| 광고 단위 | 어드민 광고 화면에서 확인·변경 |
| 연동 자격 | 어드민 Google Play·App Store 화면 |
짧은 체크리스트
정본 문서 — Play Console 실행 절차
정본: docs/admin_launch_guide_android.md ·
값(패키지·서명·AdMob ID)은 docs/deployment_playstore.md.
문서를 고칠 때는 그 파일 하나만 고치면 됩니다.
이미지 자산 — 교체 대기
여기서 올린 이미지는 서버에 대기했다가 다음 빌드 때 앱에 반영됩니다(실시간 교체 아님 — 재빌드가 필요합니다).
PNG 만 가능 · 권장 크기는 각 항목 아래에 표시됩니다. 교체 대기본은 파란 테두리로 보이고 "취소"로 되돌릴 수 있습니다. 캐릭터는 5색이 같은 모양이어야 자연스럽습니다 — 한 색만 바꾸면 어색할 수 있으니 참고하세요.
불러오는 중…
게임 미리보기 웹 빌드 · 실시간 플레이
실제 앱을 브라우저에서 그대로 실행합니다. 47개 게임을 직접 플레이해 UI를 확인하세요. 광고·인앱결제·계정 로그인은 웹에서 자동 비활성이며(순수 미리보기), 실제 출시 빌드는 Play 스토어 AAB입니다. 첫 로딩은 수 초 걸릴 수 있습니다. 소리는 화면을 한 번 탭하면 켜집니다.
iOS 는 Android 와 완전히 별개입니다
- iOS 플랫폼은 이미 추가돼 있고 릴리즈 빌드가 통과합니다 — 2026-08-16 실측(Runner.app 44.8MB). 번들 ID·서명 팀·ATT 문구까지 설정됨. 아래에서 완료 표시는 건너뛰고 남음 만 보세요.
- Mac + Xcode 가 필수입니다. Windows/Linux 만으로는 iOS 빌드·업로드가 불가합니다.
- Play 스토어 등록정보·인앱상품·순위표는 iOS 로 넘어오지 않습니다 — App Store Connect 에서 다시 만듭니다.
진행 체크리스트
체크 상태는 이 브라우저에만 저장됩니다(localStorage). 서버에는 저장하지 않습니다.
정본 문서 — App Store Connect 실행 절차
정본: docs/admin_launch_guide_ios.md · 빌드·업로드 명령은
ios/ExportOptions.plist 헤더 주석.
유료화 — 여는 조건 체크리스트
현재 현금 결제는 닫혀 있습니다(2026-08-14 판단, 2026-08-28 재확인).
iOS 는 지갑 세션도 영수증 서버검증도 없어, 지금 열면 구매가 서버 기록 없이
로컬로만 들어갑니다 — 앱 삭제·기기교체에 사라지고 대조할 근거가 없습니다.
상품을 만들기 전에 아래 문서 §7 의 6항목을 끝내야 합니다.
server/admin_smoke.js 가 순서를 검사로 막습니다.
난독화 심볼 보관함
이 파일이 없으면 난독화된 크래시 로그를 영영 해독할 수 없습니다.
릴리즈 빌드(tool\build_release.ps1)가 자동으로 여기에 올립니다.
Play Console 이 보여주는 크래시 스택이 의미 없는 주소값이면, 그 버전의 심볼을 내려받아 해독하세요
(flutter symbolize -i <스택파일> -d <심볼파일>).
빌드 PC 가 고장나도 여기 사본이 남습니다.
| 버전 | 파일 | 크기 | 업로드 | 내려받기 |
|---|---|---|---|---|
| 불러오는 중… | ||||
파일 보관함
폰에서 찍은 파일을 여기에 올리면 개발 PC 가 내려받습니다.
심사 대응용 화면녹화처럼 폰 → PC 로 옮겨야 하는 큰 파일을 위한 곳입니다. 한 개당 최대 - 까지. 앱에 반영되는 것이 아니라 그냥 주고받는 파일입니다 (앱 이미지 교체는 「이미지 자산」 메뉴).
| 파일 | 크기 | 올린 시각 | 받기 / 삭제 |
|---|---|---|---|
| 불러오는 중… | |||
계정 정보
| 로그인 아이디 | - - |
|---|---|
| 인증 방식 | - |
| 세션 만료 | - |
| 접속 IP | - |
| 서버 가동 | - |
| 서버 버전 | - |
보안
다른 기기·브라우저에 로그인이 남아 있다고 의심되면 전부 끊을 수 있습니다.
이 콘솔은 유저 지갑 보정·심볼 다운로드 등 되돌리기 어려운 작업을 포함합니다. 비밀번호는 이 서비스에서만 쓰는 것으로 설정하세요.
비밀번호 변경
변경 시 다른 모든 세션이 로그아웃됩니다.