보상형 광고

보상형 광고는 사용자에게 상호작용에 대한 대가로 인앱 보상을 제공하는 광고입니다. 이 가이드에는 AdMob의 보상형 광고를 iOS 앱에 통합하는 방법이 나와 있습니다.

기본 요건

보상형 광고 객체 만들기

보상형 광고는 GADRewardedAd 객체에 의해 요청 및 표시됩니다. 이 광고를 이용하려면 먼저 광고를 인스턴트화하고 광고 단위 ID를 설정하세요. 다음은 UIViewControllerviewDidLoad: 메소드에서 GADRewardedAd를 만드는 방법의 예입니다.

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)viewDidLoad {
  [super viewDidLoad];

  self.rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];
}

항상 테스트 광고로 테스트하기

앱을 제작하고 테스트할 때 운영 중인 실제 광고 대신 테스트 광고를 사용하세요. 이렇게 하지 않으면 계정이 정지될 수 있습니다.

테스트 광고를 로드하는 가장 쉬운 방법은 iOS 보상형 광고의 테스트 전용 광고 단위 ID를 사용하는 것입니다.

ca-app-pub-3940256099942544/1712485313

이 ID는 모든 요청에 대해 테스트 광고를 반환하도록 특별히 구성되었으며, 코딩, 테스트 및 디버깅 중에 앱에서 자유롭게 사용할 수 있습니다. 앱을 게시하기 전에 이 ID를 자체 광고 단위 ID로 바꿔야 합니다.

모바일 광고 SDK의 테스트 광고가 작동하는 방식을 자세히 알아보려면 테스트 광고를 참고하세요.

광고 로드

보상형 광고를 로드하려면 GADRewardedAd 객체의 loadRequest:completionHandler: 메소드를 호출해야 합니다.

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];

  GADRequest *request = [GADRequest request];
  [self.rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
}

이 코드는 제공된 GADRequest 및 완료 블록을 사용하여 보상형 광고를 로드합니다. 광고 요청이 완료되면 nil GADRequestError 매개변수를 통해 완료 블록이 실행됩니다. 광고가 나타나지 않으면 nil이 아닌 오류 객체에서 실패 정보를 제공합니다.

광고 게재

보상형 광고를 게재하기 전에 사용자에게 보상을 받는 대가로 보상형 광고 콘텐츠를 볼 것인지 여부를 선택할 수 있는 옵션을 명확히 제공해야 합니다. 보상형 광고에는 항상 선택 옵션을 제공해야 합니다.

보상형 광고를 표시하려면 GADRewardedAd에서 isReady 속성을 사용하여 로드가 완료되었는지 확인한 다음 presentFromRootViewController:delegate:를 호출하세요. 다음은 UIViewController의 액션 메소드 중 하나에서 이를 처리하는 방법의 예입니다.

@import GoogleMobileAds;

@import UIKit;

@interface ViewController () <GADRewardedAdDelegate>

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (IBAction)doSomething:(id)sender {
  ...
  if (self.rewardedAd.isReady) {
    [self.rewardedAd presentFromRootViewController:self delegate:self];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

광고 이벤트 알림 받기

보상형 광고 이벤트가 발생하면 presentFromRootViewController:delegate: 메소드에 제공된 GADRewardedAdDelegate가 호출됩니다. GADRewardedAdDelegate의 각 메소드는 보상형 광고의 수명 주기 중의 이벤트에 해당됩니다. rewardedAd:userDidEarnReward: 메소드에서는 구현해야 하지만 클래스의 다른 모든 메소드는 선택사항으로 표시되어 있으므로 필요한 메소드만 구현하면 됩니다. 이 예에서는 각 메소드를 구현하고 콘솔에 메시지를 기록합니다.

/// Tells the delegate that the user earned a reward.
- (void)rewardedAd:(GADRewardedAd *)rewardedAd userDidEarnReward:(GADAdReward *)reward {
  // TODO: Reward the user.
  NSLog(@"rewardedAd:userDidEarnReward:");
}

/// Tells the delegate that the rewarded ad was presented.
- (void)rewardedAdDidPresent:(GADRewardedAd *)rewardedAd {
  NSLog(@"rewardedAdDidPresent:");
}

/// Tells the delegate that the rewarded ad failed to present.
- (void)rewardedAd:(GADRewardedAd *)rewardedAd didFailToPresentWithError:(NSError *)error {
  NSLog(@"rewardedAd:didFailToPresentWithError");
}

/// Tells the delegate that the rewarded ad was dismissed.
- (void)rewardedAdDidDismiss:(GADRewardedAd *)rewardedAd {
  NSLog(@"rewardedAdDidDismiss:");
}

GADRewardedAdDelegate를 사용하여 다음 보상형 광고 미리 로드

GADRewardedAd는 일회용 객체입니다. 즉, 보상형 광고가 표시된 후에는 이 객체를 사용해 다른 광고를 로드할 수 없습니다. 다른 보상형 광고를 요청하려면 새 GADRewardedAd 객체를 만들어야 합니다.

이전 광고가 닫힌 직후에 다음 보상형 광고가 로드되기 시작하도록 GADRewardedAdDelegaterewardedAdDidDismiss: 메소드에서 다른 보상형 광고를 로드하는 것이 좋습니다.

- (void)viewDidLoad {
  [super viewDidLoad];
  self.rewardedAd = [self createAndLoadRewardedAd];
}

- (GADRewardedAd *)createAndLoadRewardedAd {
  GADRewardedAd *rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];
  GADRequest *request = [GADRequest request];
  [rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
  return rewardedAd;
}

- (void)rewardedAdDidDismiss:(GADRewardedAd *)rewardedAd {
  self.rewardedAd = [self createAndLoadRewardedAd];
}

여러 보상형 광고 로드

여러 보상형 광고를 로드하려면 보상형 광고 객체 만들기 광고 로드하기 섹션에 나온 로드하려는 광고별 단계를 따르세요. 아래의 코드 스니펫에는 두 광고 게재위치에 2개의 보상형 광고를 로드하는 방법이 나와 있습니다.

- (void)viewDidLoad {
  [super viewDidLoad];
  GADRewardedAd *gameOverRewardedAd = [self
    createAndLoadRewardedAdForAdUnit:@"ca-app-pub-3940256099942544/1712485313"];
  GADRewardedAd *extraCoinsRewardedAd = [self
    createAndLoadRewardedAdForAdUnit:@"ca-app-pub-3940256099942544/1712485313"];
}

- (GADRewardedAd *)createAndLoadRewardedAdForAdUnit:(NSString *) adUnitId {
  GADRewardedAd *rewardedAd = [[GADRewardedAd alloc] initWithAdUnitID:adUnitId];
  GADRequest *request = [GADRequest request];
  [rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
  return rewardedAd;
}

FAQ

GADRewardedAd에 대한 보상 세부정보를 확인할 수 있나요?
예. 가능합니다. userDidEarnReward 콜백이 실행되기 전에 보상 금액을 알아야 하는 경우 GADRewardedAdreward 속성에서 광고가 로드된 후의 보상 금액을 확인할 수 있습니다.
초기화 호출에 제한시간이 있나요?
10초가 지나면 미디에이션 네트워크에서 아직 초기화를 완료하지 않은 경우에도 Google 모바일 광고 SDK에서 startWithCompletionHandler: 메소드에 제공된 GADInitializationCompletionHandler를 호출합니다.
초기화 콜백을 받았을 때 일부 미디에이션 네트워크가 준비되지 않은 경우 어떻게 해야 하나요?

GADInitializationCompletionHandler 내에서 광고를 로드하는 것이 좋습니다. 미디에이션 네트워크가 준비되지 않은 경우에도 Google 모바일 광고 SDK에서 해당 네트워크에 광고를 요청합니다. 따라서 미디에이션 네트워크에서 시간이 초과된 후에 초기화를 완료하면 해당 세션에서 향후 광고 요청을 처리할 수 있습니다.

GADMobileAds.initializationStatus를 호출하여 앱 세션 전체에서 모든 어댑터의 초기화 상태를 알아볼 수 있습니다.

특정 미디에이션 네트워크가 준비되지 않은 이유를 확인하려면 어떻게 해야 하나요?

GADAdapterStatus 객체의 description 속성에서 어댑터에서 광고 요청을 처리할 준비가 되지 않은 이유를 알아볼 수 있습니다.