Ad API
Ad API
보상형 비디오·배너·공유 등 리워드 액션은 v0.2.0부터 하나의 슬롯 모델로 통합되었습니다.
사전 조회 API(getRewardedAdSlots / getRewardedAdSlot)로 활성 슬롯을 받아 렌더링하고,
사용자가 탭하면 showRewardedAd({ slotId }) 한 번으로 실행합니다. 슬롯 없이 보상형 비디오
광고만 표시하려면 showRewardedAd({ adUnitId }) 를 그대로 사용할 수 있습니다.
showRewardedAd(options) (권장)
보상형 광고/리워드를 한 번의 호출로 실행합니다. slotId 가 있으면 해당 슬롯의 액션
(영상/배너/공유)으로 실행하고, 없으면 adUnitId 를 사용한 보상형 비디오 광고로 실행합니다.
로드, 표시, 실패 시 재시도 및 안내를 플랫폼이 자동으로 처리합니다.
옵션:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
slotId | string | △ | 리워드 슬롯 ID (getRewardedAdSlots / getRewardedAdSlot 에서 획득). 우선 처리됩니다. |
adUnitId | string | △ | 광고 단위 ID. slotId 미지정 시 보상형 비디오 광고로 실행합니다. |
success | function | - | 성공 콜백 |
fail | function | - | 실패 콜백 |
complete | function | - | 완료 콜백 |
slotId와adUnitId는 모두 선택이지만 최소 하나는 제공해야 합니다. 둘 다 있으면slotId가 우선합니다.
성공 응답:
| 필드 | 타입 | 설명 |
|---|---|---|
isEnded | boolean | 리워드 완료 여부 (보상 지급 대상) |
errMsg | string | 결과 메시지 |
// 1) 리워드 슬롯 실행 (권장)
TudadaSDK.showRewardedAd({
slotId: slot.slotId,
success: (res) => {
if (res.isEnded) {
giveReward(); // 보상 지급은 게임이 직접 수행
}
},
fail: (err) => console.error('리워드 실행 실패:', err.errMsg),
});
// 2) 보상형 비디오 광고 직접 실행
TudadaSDK.showRewardedAd({
adUnitId: 'your-ad-unit-id',
success: (res) => {
if (res.isEnded) giveReward();
},
});
참고: 로드 실패 시 플랫폼이 자동으로 재시도하고, 최종 실패 시 안내 팝업을 표시합니다. 게임에서 별도의 에러 처리 UI를 구현할 필요가 없습니다.
isEnded가true이면 보상 지급 대상이며, 실제 보상 지급은 게임이 직접 수행합니다.
showRewardedAdAsync(options)
showRewardedAd() 의 Promise 버전입니다. 옵션은 동일하며, 리워드 완료 여부를 Promise<ShowRewardedAdResult> 로 반환합니다.
const result = await TudadaSDK.showRewardedAdAsync({ slotId: slot.slotId });
if (result.isEnded) {
giveReward();
}
통합 리워드 슬롯
리워드 슬롯은 보상형 비디오·배너·공유를 하나의 모델로 다루는 v0.2.0 통합 API입니다. 게임은
활성 슬롯 목록을 받아 slotData 로 직접 렌더링하고, 사용자가 탭하면 showRewardedAd({ slotId })
로 실행합니다.
각 슬롯은 다음 구조입니다.
| 필드 | 타입 | 설명 |
|---|---|---|
slotId | string | 슬롯 식별자 (실행 시 지정) |
action | string | 액션 유형 ('REWARD_VIDEO' | 'BANNER' | 'SHARE') |
slotData | object? | 게임 렌더용 데이터 (선택) |
slotData.imageUrl | string? | 슬롯 이미지 URL (게임이 직접 렌더링) |
slotData.title | string? | 슬롯 제목 |
slotData.expiresAt | number? | 만료 시각 (Unix ms) |
기본 보상형 비디오·공유 슬롯은 렌더링할 시각 요소가 없어
slotData가 없을 수 있습니다. 배너 슬롯은 보통slotData.imageUrl을 포함합니다.
getRewardedAdSlots(options?)
활성 리워드 슬롯 전체 목록을 조회합니다.
옵션:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
success | function | - | 성공 콜백 |
fail | function | - | 실패 콜백 |
complete | function | - | 완료 콜백 |
성공 응답:
| 필드 | 타입 | 설명 |
|---|---|---|
slots | RewardedAdSlot[] | 활성 슬롯 목록 |
errMsg | string | 결과 메시지 |
TudadaSDK.getRewardedAdSlots({
success: ({ slots }) => {
slots.forEach((slot) => {
if (slot.slotData?.imageUrl) renderSlot(slot);
});
},
});
getRewardedAdSlotsAsync()
getRewardedAdSlots() 의 Promise 버전입니다.
const { slots } = await TudadaSDK.getRewardedAdSlotsAsync();
getRewardedAdSlot(options)
slotId 로 단일 슬롯을 조회합니다. 슬롯이 없으면 fail 콜백이 호출됩니다.
옵션:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
slotId | string | ✅ | 조회할 슬롯 ID |
success | function | - | 성공 콜백 |
fail | function | - | 실패 콜백 (슬롯 없음 포함) |
complete | function | - | 완료 콜백 |
성공 응답:
| 필드 | 타입 | 설명 |
|---|---|---|
slot | RewardedAdSlot | 슬롯 정보 |
errMsg | string | 결과 메시지 |
TudadaSDK.getRewardedAdSlot({
slotId: 'main_menu_reward',
success: ({ slot }) => renderSlot(slot),
fail: (err) => console.warn('슬롯 없음:', err.errMsg),
});
getRewardedAdSlotAsync(slotId)
getRewardedAdSlot() 의 Promise 버전입니다. 슬롯 ID를 인자로 직접 전달하며, 슬롯이 없으면 reject됩니다.
try {
const { slot } = await TudadaSDK.getRewardedAdSlotAsync('main_menu_reward');
renderSlot(slot);
} catch (e) {
// 슬롯에 표시할 리워드가 없음 — UI 비표시
}
전체 흐름:
// 1) 활성 슬롯 조회
const { slots } = await TudadaSDK.getRewardedAdSlotsAsync();
// 2) 슬롯 렌더링 (게임이 직접)
slots.forEach((slot) => {
if (!slot.slotData?.imageUrl) return;
const el = renderSlotButton(slot.slotData);
// 3) 사용자 탭 시 실행
el.onclick = async () => {
const res = await TudadaSDK.showRewardedAdAsync({ slotId: slot.slotId });
if (res.isEnded) giveReward(); // 보상 지급은 게임이 직접 수행
};
});
createRewardedVideoAd(options) (레거시)
createRewardedVideoAd 는 레거시 API로 다음 버전에서 제거될 예정입니다. 통합 API showRewardedAd() 또는 showRewardedAdAsync() 를 사용하세요.
보상형 비디오 광고 인스턴스를 생성합니다.
옵션:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
adUnitId | string | ✅ | 광고 단위 ID |
multiton | boolean | - | 다중 인스턴스 모드 |
참고: 현재 단일 광고만 지원하며, 광고 ID는 플랫폼에서 제어하므로
adUnitId에는 임의의 문자열을 입력해도 됩니다.
인스턴스 메서드:
| 멤버 | 타입 | 설명 |
|---|---|---|
load() | Promise<void> | 광고 로드 |
show() | Promise<void> | 광고 표시 |
destroy() | void | 인스턴스 파괴 |
onLoad(callback) | void | 로드 완료 이벤트 |
onError(callback) | void | 에러 이벤트 |
onClose(callback) | void | 닫기 이벤트 |
offLoad(callback?) | void | 로드 이벤트 해제 |
offError(callback?) | void | 에러 이벤트 해제 |
offClose(callback?) | void | 닫기 이벤트 해제 |
// 광고 인스턴스 생성
const rewardedAd = TudadaSDK.createRewardedVideoAd({
adUnitId: 'your-ad-unit-id',
});
// 이벤트 리스너 등록
rewardedAd.onLoad(() => {
console.log('광고 로드 완료');
});
rewardedAd.onError((err) => {
console.error('광고 에러:', err.errMsg, err.errCode);
});
rewardedAd.onClose((res) => {
if (res.isEnded) {
// 사용자가 광고를 끝까지 시청함 → 보상 지급
console.log('보상 지급!');
giveReward();
} else {
// 사용자가 중간에 닫음
console.log('광고 중간 종료');
}
});
// 광고 로드 및 표시
rewardedAd.load()
.then(() => rewardedAd.show())
.catch((err) => console.error('광고 표시 실패:', err));
배너 광고 (슬롯 모델)
배너 광고 API(getAvailableBannerIds / getBanner / runBannerAction)는 통합 리워드 슬롯으로 대체되었으며 호환을 위해 유지됩니다. 신규 연동은 getRewardedAdSlots() 로 슬롯을 받아 showRewardedAd({ slotId })(action=BANNER)로 실행하세요.
배너 광고는 게임이 화면에 정의한 슬롯(예: "main_menu_top")에 광고를 받아 직접 그리는 방식입니다. SDK가 이미지 URL과 액션 처리만 담당하고, 렌더링·탭 감지·후처리는 게임이 자유롭게 통제합니다.
bannerId는 게임이 정의한 슬롯 이름을 겸하는 식별자입니다.- 사용자가 배너를 탭하면
runBannerAction(bannerId)을 호출해 액션 처리를 SDK에 위임합니다. - 응답은
success/fail신호만 받으며, 보상 등 후처리는 게임 내부에서 수행합니다.
getAvailableBannerIds(options)
활성화된 배너 슬롯 ID 목록을 조회합니다. 보통 게임은 자기 슬롯 이름을 알고 있으므로 이 API는 운영 메타데이터 용도입니다.
옵션:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
success | function | - | 성공 콜백 |
fail | function | - | 실패 콜백 |
complete | function | - | 완료 콜백 |
성공 응답:
| 필드 | 타입 | 설명 |
|---|---|---|
bannerIds | string[] | 활성 슬롯 이름 배열 |
errMsg | string | 결과 메시지 |
TudadaSDK.getAvailableBannerIds({
success: ({ bannerIds }) => {
console.log('활성 슬롯:', bannerIds);
},
});
getAvailableBannerIdsAsync()
getAvailableBannerIds()의 Promise 버전입니다.
const { bannerIds } = await TudadaSDK.getAvailableBannerIdsAsync();
getBanner(options)
슬롯 이름으로 그 슬롯에 매칭된 배너 데이터를 가져옵니다. 슬롯에 매칭된 광고가 없으면 fail 콜백이 호출됩니다.
옵션:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
bannerId | string | ✅ | 슬롯 이름을 겸하는 배너 ID |
success | function | - | 성공 콜백 |
fail | function | - | 실패 콜백 (매칭 없음 포함) |
complete | function | - | 완료 콜백 |
성공 응답:
| 필드 | 타입 | 설명 |
|---|---|---|
banner.bannerId | string | 슬롯 이름을 겸하는 배너 ID |
banner.imageUrl | string | 배너 이미지 URL (게임이 직접 렌더링) |
banner.expiresAt | number? | 만료 시각 (Unix ms, 선택) |
errMsg | string | 결과 메시지 |
TudadaSDK.getBanner({
bannerId: 'main_menu_top',
success: ({ banner }) => {
const img = document.createElement('img');
img.src = banner.imageUrl;
document.body.appendChild(img);
},
fail: (err) => {
console.warn('이 슬롯에는 표시할 광고가 없습니다:', err.errMsg);
},
});
getBannerAsync(bannerId)
getBanner()의 Promise 버전입니다. 매칭되는 광고가 없으면 reject됩니다.
try {
const { banner } = await TudadaSDK.getBannerAsync('main_menu_top');
renderBanner(banner.imageUrl);
} catch (e) {
// 슬롯에 매칭된 광고 없음 — UI 비표시
}
runBannerAction(options)
사용자가 배너를 탭한 시점에 게임이 호출합니다. SDK가 액션(딥링크/외부링크 등)을 처리하고 success / fail 신호만 통지합니다.
보상 등 후처리는 게임 내부에서 수행합니다.
옵션:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
bannerId | string | ✅ | 슬롯 이름을 겸하는 배너 ID |
success | function | - | 성공 콜백 — 게임이 보상 지급 등 후처리 |
fail | function | - | 실패 콜백 |
complete | function | - | 완료 콜백 |
img.onclick = () => {
TudadaSDK.runBannerAction({
bannerId: 'main_menu_top',
success: () => {
grantReward(); // 게임 내부 보상 지급
},
fail: (err) => {
showToast(err.errMsg);
},
});
};
runBannerActionAsync(bannerId)
runBannerAction()의 Promise 버전입니다.
img.onclick = async () => {
try {
await TudadaSDK.runBannerActionAsync('main_menu_top');
grantReward();
} catch (e) {
showToast('처리 실패');
}
};