概要
リワード広告は、ユーザーが動画広告を最後まで視聴すると、ゲーム内通貨、ライフ、ヒントなどの報酬を提供するフルスクリーン動画広告です。主な特徴
- フルスクリーンを占める動画広告
- ユーザーが広告を完全に視聴した場合にのみ報酬を提供
- ユーザーが自ら広告視聴を選択 (例: 「動画を見てライフを獲得」ボタン)
- 報酬タイプと数量を設定可能
開発環境ではテストユニットIDを使用してください:
PUBLIC_TEST_UNIT_ID_REWARDED実装方法
リワード広告は次の手順で実装します:- AdropRewardedAdインスタンスの生成 - ユニットIDで広告オブジェクトを生成
- Delegateの設定 - 広告イベント処理のためのdelegateを指定
- 広告の読み込み -
load()メソッドで広告をリクエスト - 広告の表示 -
show()メソッドで広告を表示し、報酬を処理
Swift例
基本実装
コピー
import UIKit
import AdropAds
class RewardedViewController: UIViewController {
private var rewardedAd: AdropRewardedAd?
override func viewDidLoad() {
super.viewDidLoad()
// 1. AdropRewardedAdインスタンスの生成
rewardedAd = AdropRewardedAd(unitId: "YOUR_UNIT_ID")
// 2. Delegateの設定
rewardedAd?.delegate = self
// 3. 広告の読み込み
rewardedAd?.load()
}
@IBAction func showRewardedAdButtonTapped(_ sender: UIButton) {
// 広告が読み込まれたか確認
guard rewardedAd?.isLoaded == true else {
print("広告がまだ読み込まれていません")
return
}
// 4. 広告の表示と報酬処理
rewardedAd?.show(fromRootViewController: self) { [weak self] type, amount in
// 報酬付与処理
print("報酬獲得 - タイプ: \(type), 数量: \(amount)")
self?.grantReward(type: type, amount: amount)
}
}
private func grantReward(type: Int, amount: Int) {
// ユーザーに報酬を付与
// 例: ゲーム通貨の追加、ライフの回復など
// ⚠️ 重要: サーバーで報酬を検証することを推奨
// クライアントのみで報酬を処理すると不正行為が可能
}
}
// MARK: - AdropRewardedAdDelegate
extension RewardedViewController: AdropRewardedAdDelegate {
// 必須: 広告受信成功
func onAdReceived(_ ad: AdropRewardedAd) {
print("広告受信完了")
// 広告視聴ボタンを有効化するなど
}
// 必須: 広告受信失敗
func onAdFailedToReceive(_ ad: AdropRewardedAd, _ errorCode: AdropErrorCode) {
print("広告受信失敗: \(errorCode)")
// 広告視聴ボタンを無効状態に維持するなど
}
// オプション: 広告表示
func onAdImpression(_ ad: AdropRewardedAd) {
print("広告表示")
}
// オプション: 広告クリック
func onAdClicked(_ ad: AdropRewardedAd) {
print("広告クリック")
}
// オプション: 広告画面表示完了
func onAdDidDismissFullScreen(_ ad: AdropRewardedAd) {
print("広告画面を閉じた")
// 次の広告を事前読み込み
rewardedAd?.load()
}
}
SwiftUI例
コピー
import SwiftUI
import AdropAds
class RewardedAdViewModel: NSObject, ObservableObject, AdropRewardedAdDelegate {
@Published var isAdReady = false
@Published var showingAlert = false
@Published var alertMessage = ""
private var rewardedAd: AdropRewardedAd?
override init() {
super.init()
loadAd()
}
func loadAd() {
rewardedAd = AdropRewardedAd(unitId: "YOUR_UNIT_ID")
rewardedAd?.delegate = self
rewardedAd?.load()
}
func showAd() {
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let rootViewController = windowScene.windows.first?.rootViewController else {
return
}
rewardedAd?.show(fromRootViewController: rootViewController) { [weak self] type, amount in
self?.alertMessage = "報酬獲得! タイプ: \(type), 数量: \(amount)"
self?.showingAlert = true
self?.grantReward(type: type, amount: amount)
}
}
private func grantReward(type: Int, amount: Int) {
// 報酬付与処理
print("報酬付与 - タイプ: \(type), 数量: \(amount)")
}
// MARK: - AdropRewardedAdDelegate
func onAdReceived(_ ad: AdropRewardedAd) {
isAdReady = true
}
func onAdFailedToReceive(_ ad: AdropRewardedAd, _ errorCode: AdropErrorCode) {
isAdReady = false
alertMessage = "広告読み込み失敗: \(errorCode)"
showingAlert = true
}
func onAdDidDismissFullScreen(_ ad: AdropRewardedAd) {
isAdReady = false
// 次の広告を事前読み込み
loadAd()
}
}
struct RewardedAdView: View {
@StateObject private var viewModel = RewardedAdViewModel()
var body: some View {
VStack(spacing: 20) {
Text("リワード広告サンプル")
.font(.title)
Button(action: {
viewModel.showAd()
}) {
Text("動画を見て報酬を獲得")
.padding()
.background(viewModel.isAdReady ? Color.blue : Color.gray)
.foregroundColor(.white)
.cornerRadius(8)
}
.disabled(!viewModel.isAdReady)
}
.alert(isPresented: $viewModel.showingAlert) {
Alert(
title: Text("通知"),
message: Text(viewModel.alertMessage),
dismissButton: .default(Text("確認"))
)
}
}
}
Objective-C例
コピー
@import AdropAds;
@interface RewardedViewController () <AdropRewardedAdDelegate>
@property (nonatomic, strong) AdropRewardedAd *rewardedAd;
@end
@implementation RewardedViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1. AdropRewardedAdインスタンスの生成
self.rewardedAd = [[AdropRewardedAd alloc] initWithUnitId:@"YOUR_UNIT_ID"];
// 2. Delegateの設定
self.rewardedAd.delegate = self;
// 3. 広告の読み込み
[self.rewardedAd load];
}
- (IBAction)showRewardedAdButtonTapped:(UIButton *)sender {
// 広告が読み込まれたか確認
if (!self.rewardedAd.isLoaded) {
NSLog(@"広告がまだ読み込まれていません");
return;
}
// 4. 広告の表示と報酬処理
__weak typeof(self) weakSelf = self;
[self.rewardedAd showFromRootViewController:self
userDidEarnRewardHandler:^(NSInteger type, NSInteger amount) {
NSLog(@"報酬獲得 - タイプ: %ld, 数量: %ld", (long)type, (long)amount);
[weakSelf grantRewardWithType:type amount:amount];
}];
}
- (void)grantRewardWithType:(NSInteger)type amount:(NSInteger)amount {
// ユーザーに報酬を付与
}
#pragma mark - AdropRewardedAdDelegate
// 必須: 広告受信成功
- (void)onAdReceived:(AdropRewardedAd *)ad {
NSLog(@"広告受信完了");
}
// 必須: 広告受信失敗
- (void)onAdFailedToReceive:(AdropRewardedAd *)ad :(AdropErrorCode)errorCode {
NSLog(@"広告受信失敗: %ld", (long)errorCode);
}
// オプション: 広告画面を閉じた直後
- (void)onAdDidDismissFullScreen:(AdropRewardedAd *)ad {
NSLog(@"広告画面を閉じた");
// 次の広告を事前読み込み
[self.rewardedAd load];
}
@end
報酬処理
報酬コールバック
show()メソッドのuserDidEarnRewardHandlerパラメータで報酬コールバックを渡します。
コピー
rewardedAd?.show(fromRootViewController: self) { type, amount in
// type: 報酬タイプ (Int)
// amount: 報酬数量 (Int)
print("報酬獲得 - タイプ: \(type), 数量: \(amount)")
}
報酬タイプと数量
- type: Adropコンソールで設定した報酬タイプ (整数値)
- amount: Adropコンソールで設定した報酬数量 (整数値)
クライアントのみで報酬を処理すると、ユーザーがアプリを改変して不正に報酬を獲得できる可能性があります。ゲームや重要な報酬があるアプリは、必ずサーバー側の検証を実装してください。
ベストプラクティス
1. 広告の事前読み込み
ユーザー体験のために広告を事前に読み込んでおくことをお勧めします。コピー
class GameViewController: UIViewController {
private var rewardedAd: AdropRewardedAd?
override func viewDidLoad() {
super.viewDidLoad()
// 画面進入時に広告を事前読み込み
loadRewardedAd()
}
private func loadRewardedAd() {
rewardedAd = AdropRewardedAd(unitId: "YOUR_UNIT_ID")
rewardedAd?.delegate = self
rewardedAd?.load()
}
}
extension GameViewController: AdropRewardedAdDelegate {
func onAdDidDismissFullScreen(_ ad: AdropRewardedAd) {
// 広告が閉じた後、次の広告を事前読み込み
loadRewardedAd()
}
}
2. 広告準備状態の確認
広告が読み込まれたかを確認し、UIを更新します。コピー
class GameViewController: UIViewController {
@IBOutlet weak var watchAdButton: UIButton!
private var rewardedAd: AdropRewardedAd?
private var isAdReady = false
private func updateButtonState() {
watchAdButton.isEnabled = isAdReady
watchAdButton.alpha = isAdReady ? 1.0 : 0.5
watchAdButton.setTitle(
isAdReady ? "動画を見てライフを獲得" : "広告読み込み中...",
for: .normal
)
}
}
extension GameViewController: AdropRewardedAdDelegate {
func onAdReceived(_ ad: AdropRewardedAd) {
isAdReady = true
updateButtonState()
}
func onAdFailedToReceive(_ ad: AdropRewardedAd, _ errorCode: AdropErrorCode) {
isAdReady = false
updateButtonState()
}
}