メインコンテンツへスキップ

概要

リワード広告は、ユーザーが動画広告を最後まで視聴すると、ゲーム内通貨、ライフ、ヒントなどの報酬を提供するフルスクリーン動画広告です。

主な特徴

  • フルスクリーンを占める動画広告
  • ユーザーが広告を完全に視聴した場合にのみ報酬を提供
  • ユーザーが自ら広告視聴を選択 (例: 「動画を見てライフを獲得」ボタン)
  • 報酬タイプと数量を設定可能
開発環境ではテストユニットIDを使用してください: PUBLIC_TEST_UNIT_ID_REWARDED

実装方法

リワード広告は次の手順で実装します:
  1. AdropRewardedAdインスタンスの生成 - ユニットIDで広告オブジェクトを生成
  2. Delegateの設定 - 広告イベント処理のためのdelegateを指定
  3. 広告の読み込み - load()メソッドで広告をリクエスト
  4. 広告の表示 - 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()
    }
}

関連ドキュメント