実装方法
バナー広告は2つの方法で実装できます。
| 方式 | 説明 | 推奨 |
|---|
| Data Attributes | HTML属性のみで簡単に実装 | 迅速な実装 |
| renderAd | 広告読み込みタイミングを直接制御 | 細かい制御が必要な場合 |
開発環境ではテストユニットIDを使用してください:PUBLIC_TEST_UNIT_ID_320_100
1. Data Attributes方式
最も簡単な方式で、data-adrop-unit属性を追加するだけでSDKが自動的に広告を読み込みます。
function BannerAd() {
return (
<div
data-adrop-unit="YOUR_UNIT_ID"
data-adrop-context-id="YOUR_CONTEXT_ID"
data-adrop-theme="light"
/>
);
}
Data Attributes
広告の再リクエスト
Reactのkeyを変更してコンポーネントを再マウントすると、広告が再リクエストされます。
function App() {
const [adKey, setAdKey] = useState(0);
const reloadAd = () => {
setAdKey(prev => prev + 1);
};
return (
<>
<div key={adKey} data-adrop-unit="YOUR_UNIT_ID" />
<button onClick={reloadAd}>広告を更新</button>
</>
);
}
2. renderAd方式
広告読み込みタイミングを直接制御したい場合に使用します。
import { useEffect, useRef } from 'react';
import Adrop from '@adrop/ads-web-sdk';
function BannerAd() {
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const adrop = Adrop.instance();
if (containerRef.current) {
adrop.renderAd(containerRef.current, {
unit: 'YOUR_UNIT_ID',
contextId: 'YOUR_CONTEXT_ID',
theme: 'light'
});
}
}, []);
return <div ref={containerRef} />;
}
renderAdオプション
ユーザー識別子(SDK設定値を個別の広告枠で上書きする場合に使用)
広告の再リクエスト
renderAd()を再度呼び出すと、広告が再リクエストされます。Data Attributesで作成した広告枠にも使用できます。
function BannerAd() {
const containerRef = useRef<HTMLDivElement>(null);
const reloadAd = () => {
const adrop = Adrop.instance();
if (containerRef.current) {
adrop.renderAd(containerRef.current, {
unit: 'YOUR_UNIT_ID'
});
}
};
return (
<>
<div ref={containerRef} />
<button onClick={reloadAd}>広告を更新</button>
</>
);
}
Data Attributesで作成した広告枠にrenderAd()を呼び出す場合、data attributesに存在しない項目や修正したい項目のみを渡せば十分です。
広告の削除
clear()を呼び出してコンテナから広告を削除できます。
const adrop = Adrop.instance();
adrop.clear(containerRef.current);
広告サイズ
コンテナをユニットに登録したサイズに合わせて設定してください。
<div
data-adrop-unit="YOUR_UNIT_ID"
style={{ width: 320, height: 100 }}
/>
| 区分 | サイズ設定 | 配置 |
|---|
| ダイレクト広告 | レスポンシブ対応、高さ必須 | 水平/垂直中央 |
| バックフィル広告 | 初期幅合わせ、高さ必須 | 水平中央 |
イベント処理
広告の状態変化を検出して、適切なUI処理ができます。
import { useEffect, useRef } from 'react';
import Adrop from '@adrop/ads-web-sdk';
function BannerAd({ unitId }: { unitId: string }) {
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const adrop = Adrop.instance();
// 広告受信成功
const handleReceived = (unit: string, adData: any) => {
console.log('広告受信:', unit);
};
// 配信可能なダイレクト広告なし
const handleNoFill = (unit: string) => {
console.warn('広告なし:', unit);
};
// リクエスト失敗
const handleFailed = (unit: string) => {
console.error('広告失敗:', unit);
};
// インプレッション
const handleImpression = (unit: string) => {
console.log('広告表示:', unit);
};
// クリック
const handleClicked = (unit: string) => {
console.log('広告クリック:', unit);
};
// バックフィル広告なし
const handleBackfillNoFill = (unit: string) => {
console.warn('バックフィル広告なし:', unit);
};
// 特定ユニットのみフィルタリング
const filter = { unit: unitId };
adrop.on(Adrop.Events.AD_RECEIVED, handleReceived, filter);
adrop.on(Adrop.Events.AD_NO_FILL, handleNoFill, filter);
adrop.on(Adrop.Events.AD_FAILED, handleFailed, filter);
adrop.on(Adrop.Events.AD_IMPRESSION, handleImpression, filter);
adrop.on(Adrop.Events.AD_CLICKED, handleClicked, filter);
adrop.on(Adrop.Events.AD_BACKFILL_NO_FILL, handleBackfillNoFill, filter);
if (containerRef.current) {
adrop.renderAd(containerRef.current, { unit: unitId });
}
return () => {
adrop.off(Adrop.Events.AD_RECEIVED, handleReceived);
adrop.off(Adrop.Events.AD_NO_FILL, handleNoFill);
adrop.off(Adrop.Events.AD_FAILED, handleFailed);
adrop.off(Adrop.Events.AD_IMPRESSION, handleImpression);
adrop.off(Adrop.Events.AD_CLICKED, handleClicked);
adrop.off(Adrop.Events.AD_BACKFILL_NO_FILL, handleBackfillNoFill);
};
}, [unitId]);
return <div ref={containerRef} />;
}
サポートするイベント
| イベント | 定数 | 説明 |
|---|
| 広告受信 | AD_RECEIVED | 広告リクエスト成功 |
| 広告なし | AD_NO_FILL | 配信可能なダイレクト広告なし |
| リクエスト失敗 | AD_FAILED | 広告リクエスト失敗 |
| インプレッション | AD_IMPRESSION | 広告インプレッション記録 |
| クリック | AD_CLICKED | ユーザーが広告をクリック |
| バックフィルなし | AD_BACKFILL_NO_FILL | バックフィル広告なし |
コンポーネントのアンマウント時に必ずoff()でイベントリスナーを解除してください。
AdData
イベントハンドラーで受け取る広告データです。詳細なフィールド情報はリファレンス > AdDataを参照してください。
完全なサンプル
BannerAd.tsx
import { useEffect, useRef } from 'react';
import Adrop from '@adrop/ads-web-sdk';
interface BannerAdProps {
unitId: string;
contextId?: string;
theme?: 'light' | 'dark';
onReceived?: (adData: any) => void;
onFailed?: () => void;
onClicked?: () => void;
}
function BannerAd({
unitId,
contextId,
theme = 'light',
onReceived,
onFailed,
onClicked
}: BannerAdProps) {
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const adrop = Adrop.instance();
const filter = { unit: unitId };
const handleReceived = (_: string, adData: any) => onReceived?.(adData);
const handleFailed = () => onFailed?.();
const handleClicked = () => onClicked?.();
adrop.on(Adrop.Events.AD_RECEIVED, handleReceived, filter);
adrop.on(Adrop.Events.AD_FAILED, handleFailed, filter);
adrop.on(Adrop.Events.AD_CLICKED, handleClicked, filter);
if (containerRef.current) {
adrop.renderAd(containerRef.current, {
unit: unitId,
contextId,
theme
});
}
return () => {
adrop.off(Adrop.Events.AD_RECEIVED, handleReceived);
adrop.off(Adrop.Events.AD_FAILED, handleFailed);
adrop.off(Adrop.Events.AD_CLICKED, handleClicked);
};
}, [unitId, contextId, theme]);
return <div ref={containerRef} className="banner-ad-container" />;
}
export default BannerAd;
使用例
import BannerAd from './components/BannerAd';
function App() {
return (
<div>
<header>
<BannerAd
unitId="HEADER_BANNER_UNIT_ID"
onClicked={() => console.log('ヘッダーバナークリック')}
/>
</header>
<main>
<h1>コンテンツ</h1>
</main>
<footer>
<BannerAd
unitId="FOOTER_BANNER_UNIT_ID"
theme="dark"
/>
</footer>
</div>
);
}