postMessage 레퍼런스
권장:
KPlayAPI클래스를 사용하면 아래 프로토콜을 직접 다룰 필요 없습니다.
KPlayAPI를 사용하지 않고 직접 통신할 경우의 raw 프로토콜입니다.
게임 → KPlay
// 아이템 구매
window.parent.postMessage({ type: 'purchase-item', itemId: 'boost-1', itemName: 'Boost', price: 50 }, '*');
// 크레딧 충전 모달
window.parent.postMessage({ type: 'credit-shop' }, '*');
// 로그인 요청
window.parent.postMessage({ type: 'login-required' }, '*');
// 점수 제출
window.parent.postMessage({ type: 'submit-score', score: 15000 }, '*');
// 랭킹창 표시
window.parent.postMessage({ type: 'show-leaderboard' }, '*');
// 클라우드 스토리지 (requestId로 응답 매칭)
window.parent.postMessage({ type: 'storage-load', requestId: 'r1' }, '*');
window.parent.postMessage({ type: 'storage-set', requestId: 'r2', key: 'score', value: '100' }, '*');
window.parent.postMessage({ type: 'storage-remove', requestId: 'r3', key: 'score' }, '*');
// 전면 광고 (인터스티셜)
window.parent.postMessage({ type: 'show-interstitial-ad', adType: 'next', name: 'level-clear' }, '*');
// 보상형 광고
window.parent.postMessage({ type: 'show-rewarded-ad' }, '*');
KPlay → 게임
window.addEventListener('message', (e) => {
switch (e.data?.type) {
case 'user-info':
// { userId: string|null, name: string|null, credits: number }
break;
case 'purchase-result':
// 성공: { success: true, transactionId: string, balance: number }
// 실패: { success: false, error: string }
break;
case 'score-submitted':
// { success: boolean, rank?: number }
break;
case 'storage-load-result':
// { requestId, success: true, data: { [key]: string } } | { requestId, success: false, error }
break;
case 'storage-set-result':
case 'storage-remove-result':
// { requestId, success: boolean, key?, error? }
break;
case 'interstitial-ad-result':
// { shown: boolean }
break;
case 'rewarded-ad-result':
// 성공: { success: true, rewarded: true, points: number }
// 실패: { success: false, error: string }
break;
}
});