実装方法
ネイティブ広告は、アプリのデザインに合わせてカスタムUIで広告を表示できます。
| 方式 | 説明 | 推奨 |
|---|
| 基本テンプレート | SDK提供テンプレート使用 | 迅速な実装 |
| カスタムUI | 直接UI構成 | デザインカスタマイズが必要な場合 |
開発環境ではテストユニットIDを使用してください:PUBLIC_TEST_UNIT_ID_NATIVE
基本テンプレート
バナー広告と同じ方式で基本テンプレートを使用できます。SDKが提供するテンプレートに画像、テキストが自動的にレンダリングされます。
function NativeAd() {
return <div data-adrop-unit="YOUR_NATIVE_UNIT_ID" />;
}
基本テンプレートは広告主プロフィールセクションをサポートしていません。広告主プロフィールを表示するには、カスタムUIを使用してください。
カスタムUI
1. Data Attributes方式
data-adrop-render="custom"属性を追加し、内部要素にdata-adrop-native属性でフィールドをバインディングします。
function CustomNativeAd() {
return (
<div
data-adrop-unit="YOUR_NATIVE_UNIT_ID"
data-adrop-render="custom"
data-adrop-entire-click="true"
className="native-ad"
>
{/* 広告主プロフィール */}
<div className="ad-profile">
<img data-adrop-native="profile.displayLogo" alt="広告主" />
<span data-adrop-native="profile.displayName"></span>
</div>
{/* 広告コンテンツ */}
<h3 data-adrop-native="headline"></h3>
<img data-adrop-native="asset" alt="広告" />
<p data-adrop-native="body"></p>
{/* 追加テキスト項目 */}
<span data-adrop-native="extra.price"></span>
{/* CTAボタン */}
<button data-adrop-native="callToAction"></button>
</div>
);
}
Data Attributes
全体領域クリックを有効化
false:テキスト/画像のみクリック可能、広告主プロフィールクリック時はプロフィールリンクに移動
true:コンテナ全体クリック可能、すべてのクリックが広告先に移動
2. renderAd方式
広告読み込みタイミングを直接制御したい場合に使用します。
import { useEffect, useRef } from 'react';
import Adrop from '@adrop/ads-web-sdk';
function CustomNativeAd() {
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const adrop = Adrop.instance();
if (containerRef.current) {
adrop.renderAd(containerRef.current, {
unit: 'YOUR_NATIVE_UNIT_ID',
contextId: 'YOUR_CONTEXT_ID',
theme: 'light',
trackMode: 1, // カスタムUI使用時必須
isEntireClick: true // 全体領域クリックを有効化
});
}
return () => {
};
}, []);
return (
<div ref={containerRef} className="native-ad">
<div className="ad-profile">
<img data-adrop-native="profile.displayLogo" alt="広告主" />
<span data-adrop-native="profile.displayName"></span>
</div>
<h3 data-adrop-native="headline"></h3>
<img data-adrop-native="asset" alt="広告" />
<p data-adrop-native="body"></p>
<button data-adrop-native="callToAction"></button>
</div>
);
}
renderAdオプション
ユーザー識別子(SDK設定値を個別の広告枠で上書きする場合に使用)
フィールドバインディング
data-adrop-native属性で広告データをUI要素にバインディングします。
| フィールド | 説明 | 要素タイプ |
|---|
profile.displayLogo | 広告主ロゴURL | <img> |
profile.displayName | 広告主名 | テキスト |
headline | 広告タイトル | テキスト |
body | 広告説明 | テキスト |
asset | メイン画像URL | <img> |
callToAction | CTAボタンテキスト | テキスト |
extra.{key} | 追加テキスト項目 | テキスト |
extra.{key}はアドコントロールコンソールで設定した追加テキスト項目のIDです。必須設定していない場合は空の可能性があります。
広告主プロフィール(profile.displayLogo、profile.displayName)を表示するには、アドコントロールコンソールで該当広告ユニットの広告主プロフィール表示を有効化する必要があります。
広告サイズ
カスタムUIのサイズは自由に設定できます。
| 区分 | サイズ設定 | 配置 |
|---|
| ダイレクト広告 | レスポンシブ対応 | 水平/垂直中央 |
| バックフィル広告 | 初期幅合わせ、高さ必須 | 水平中央 |
バックフィル広告はコンテナサイズに合う素材をリクエストします。適切なサイズを指定してください。
requestAdでデータのみ取得
UIを完全に直接制御したい場合は、requestAdで広告データのみを取得できます。
import { useState, useEffect } from 'react';
import Adrop from '@adrop/ads-web-sdk';
function NativeAd() {
const [adData, setAdData] = useState<AdData | null>(null);
useEffect(() => {
async function loadAd() {
const adrop = Adrop.instance();
const response = await adrop.requestAd({
unit: 'YOUR_NATIVE_UNIT_ID',
trackMode: 1
});
if (response.code === 0 && response.result) {
setAdData(response.result);
}
}
loadAd();
}, []);
if (!adData) return null;
return (
<div className="native-ad">
<div className="ad-header">
{adData.profile?.displayLogo && (
<img src={adData.profile.displayLogo} alt="広告主" />
)}
<span>{adData.profile?.displayName}</span>
</div>
<h3>{adData.headline}</h3>
{adData.asset && <img src={adData.asset} alt="広告" />}
<p>{adData.body}</p>
<a href={adData.destinationURL} target="_blank" rel="noopener noreferrer">
{adData.callToAction}
</a>
</div>
);
}
requestAd使用時はインプレッション/クリック追跡を直接実装する必要があります。また、この方式ではバックフィル広告はサポートされていません。特別な場合でなければrenderAdを推奨します。
AdropAdResponse
requestAd()の戻り値です。
| フィールド | タイプ | 説明 |
|---|
code | number | レスポンスコード(0:成功、4000-4003:エラー) |
msg | string | レスポンスメッセージ |
result | AdData | 広告データ(成功時のみ存在) |
AdData
広告データオブジェクトです。イベントハンドラーでも同じ構造で渡されます。詳細はリファレンス > AdDataを参照してください。
| フィールド | タイプ | 説明 |
|---|
format | string | 広告フォーマット(banner、nativeAd、backfill) |
unit | string | ユニットID |
headline | string | 広告タイトル |
body | string | 広告説明 |
callToAction | string | CTAボタンテキスト |
asset | string | メイン画像URL |
destinationURL | string | クリック時の移動先URL |
profile.displayLogo | string | 広告主ロゴURL |
profile.displayName | string | 広告主名 |
profile.link | string | 広告主プロフィールリンク |
extra | Record<string, string> | 追加テキスト項目 |
イベント処理
import { useEffect, useRef } from 'react';
import Adrop from '@adrop/ads-web-sdk';
function NativeAd({ unitId }: { unitId: string }) {
const containerRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const adrop = Adrop.instance();
const filter = { unit: unitId };
const handleReceived = (unit: string, adData: any) => {
console.log('広告受信:', adData);
};
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);
};
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);
if (containerRef.current) {
adrop.renderAd(containerRef.current, {
unit: unitId,
trackMode: 1,
isEntireClick: true
});
}
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);
};
}, [unitId]);
return (
<div ref={containerRef} className="native-ad">
<div className="ad-profile">
<img data-adrop-native="profile.displayLogo" alt="広告主" />
<span data-adrop-native="profile.displayName"></span>
</div>
<h3 data-adrop-native="headline"></h3>
<img data-adrop-native="asset" alt="広告" />
<p data-adrop-native="body"></p>
<button data-adrop-native="callToAction"></button>
</div>
);
}
サポートするイベント
| イベント | 定数 | 説明 |
|---|
| 広告受信 | AD_RECEIVED | 広告リクエスト成功 |
| 広告なし | AD_NO_FILL | 配信可能なダイレクト広告なし |
| リクエスト失敗 | AD_FAILED | 広告リクエスト失敗 |
| インプレッション | AD_IMPRESSION | 広告インプレッション記録 |
| クリック | AD_CLICKED | ユーザーが広告をクリック |
| バックフィルなし | AD_BACKFILL_NO_FILL | バックフィル広告なし |