# AdMob

## 1. 기본 요건

* [<mark style="color:blue;">ADX iOS SDK</mark>](/adx/ios/integrate.md#adxlibrary-cocoapods)를 프로젝트에 추가합니다.
* Rewarded Ad용으로 발급받은 AdMob Ad Unit ID를 사용합니다.
* 광고를 요청하기 전에 [<mark style="color:blue;">SDK 초기화</mark>](https://platform-business.gitbook.io/adx/ios/sdk-integration/ad-formats/rewarded-ad-hidden/pages/O5ozkJcMAyY6hEZgu6km#1.-initialize-and-gdpr-content-ui)를 먼저 진행해야 합니다.
  * **SDK 초기화는 앱 실행 시 한 번만 호출**하여 주시고, **광고 요청은 초기화가 완료된 후**에 이뤄져야 합니다.
  * iOS 14 이상 지원하는 경우, [<mark style="color:blue;">ATT(App Tracking Transparency)</mark>](/adx/ios/supporting-ios-14/app-tracking-transparency.md) 권한 요청 완료 후 광고를 요청해주세요.
* `Info.plist` 파일에 `GADApplicationIdentifier` 키와 발급된 AdMob APP ID를 추가합니다.

  <div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p><code>GADApplicationIdentifier</code>를 추가하지 않으면 다음 메시지가 표시되며 앱이 비정상 종료됩니다.<code>The Google Mobile Ads SDK was initialized incorrectly.</code></p><hr><pre><code>&#x3C;key>GADApplicationIdentifier&#x3C;/key>
  &#x3C;string>ADMOB_APP_ID&#x3C;/string>
  </code></pre></div>

## 2. 구현

{% hint style="info" %}
**Rewarded Ad load에 시간이 걸릴 수 있으니, 미리 load 해두신 다음 사용하시는 것을 권장드립니다.**
{% endhint %}

1. `GADRequest`를 생성합니다.
   * GDPR 관련 규정을 준수하는 경우, 사용자가 개인정보 활용 및 수집을 거부한 상태(`ADXConsentStateDenied`)일 때 `npa`를 `1`로 추가합니다.
2. `GADRewardedAd` 의 `loadWithAdUnitID:request:completionHandler:` 메서드로 광고를 로드합니다.
3. 광고 로드가 완료되면 `GADFullScreenContentDelegate` callback을 등록합니다.
4. `GADRewardedAd` 의 `presentFromRootViewController:userDidEarnRewardHandler:`로 광고를 표시합니다.
5. 광고 시청을 모두 완료하면 `GADUserDidEarnRewardHandler` 객체에서 보상을 지급하도록 처리합니다.

> AdMob iOS SDK 12.0.0+ 경우, Swift용 API 이름이 변경되었으므로 유의하십시오.

{% tabs %}
{% tab title="Objective-C" %}

```objectivec
#import <ADXLibrary/ADXGdprManager.h>
@import GoogleMobileAds;

@interface AdMobRewardViewController () <GADFullScreenContentDelegate>

@property (nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation AdMobRewardViewController

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

- (void)createAndLoadRewardedAd {                   
    GADRequest *request = [GADRequest request];
    //*** GDPR
    if ([ADXGdprManager sharedInstance].consentState == ADXConsentStateDenied) {
        GADExtras *extras = [[GADExtras alloc] init];
        extras.additionalParameters = @{@"npa": @"1"};
        [request registerAdNetworkExtras:extras];
    }
  
    [GADRewardedAd loadWithAdUnitID:@"<ADMOB_REWARD_AD_UNIT_ID>" request:request completionHandler:^(GADRewardedAd *rewardedAd, NSError *error) {
        if (error) {
            // Handle ad failed to load case.
        } else {
            // Ad successfully loaded.
            self.rewardedAd = rewardedAd;
            self.rewardedAd.fullScreenContentDelegate = self;
        }
    }]; 
}

- (IBAction)selectShowAd:(id)sender {
    if (self.rewardedAd) {
        [self.rewardedAd presentFromRootViewController:self userDidEarnRewardHandler:^{
            GADAdReward *reward = self.rewardedAd.adReward;
            // TODO: Reward the uesr!
        }];
    } else {
        NSLog(@"Ad wasn't ready");
        [self createAndLoadRewardedAd];
    }
}

#pragma mark - GADFullScreenContentDelegate

- (void)adDidDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
    [self createAndLoadRewardedAd];
}

@end
```

{% endtab %}

{% tab title="Swift" %}

```swift
// AdMob iOS SDK 12.0.0+ 기준 예제 코드
import UIKit
import ADXLibrary
import GoogleMobileAds

class AdMobRewardViewController: UIViewController {
    var rewardedAd: RewardedAd?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        createAndLoadRewardedAd()
    }
    
    func createAndLoadRewardedAd() {
        let request = Request()
        //*** GDPR
        if ADXGdprManager.sharedInstance().consentState == .denied {
            let extras = Extras()
            extras.additionalParameters = ["npa": "1"]
            request.register(extras)
        }
        
        RewardedAd.load(with: "<ADMOB_REWARD_AD_UNIT_ID>", request: request) { (rewardedAd, error) in
            if let error = error {
                print("Loading failed: \(error)")
            } else {
                print("Loading Succeeded")
                self.rewardedAd = rewardedAd;
                self.rewardedAd?.fullScreenContentDelegate = self;
            }
        }
    }
    
    @IBAction func selectShowAd(_ sender: Any) {
        if (rewardedAd != nil) {
            rewardedAd?.present(from: self, userDidEarnRewardHandler: {
                if let reward = self.rewardedAd?.adReward {
                    print("Reward received with currency: \(reward.type), amount \(reward.amount).")
                }
            })
        } else {
            createAndLoadRewardedAd()
        }
    }
}

// MARK: - FullScreenContentDelegate
extension AdMobRewardViewController: FullScreenContentDelegate {

    func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
        print("Rewarded ad dismissed.")
        createAndLoadRewardedAd()
    }
}

```

{% endtab %}
{% endtabs %}

## 3. Callback

`GADFullScreenContentDelegate`를 설정하여 특정 이벤트를 수신할 수 있습니다. 필요에 따라 구현해주세요.

{% hint style="info" %}
`GADRewardedAd`는 **일회용 객체**로 보상형 광고가 표시된 후에는 다시 표시되지 않습니다.

이전 광고가 닫힌 직후 다음 보상형 광고가 로드될 수 있도록 `adDidDismissFullScreenContent:` 에 다른 보상형 광고를 로드하는 것이 좋습니다.
{% endhint %}

```objectivec
#pragma mark - GADFullScreenContentDelegate

/// Tells the delegate that an impression has been recorded for the ad.
- (void)adDidRecordImpression:(id<GADFullScreenPresentingAd>)ad;

/// Tells the delegate that the ad failed to present full screen content.
- (void)ad:(id<GADFullScreenPresentingAd>)ad didFailToPresentFullScreenContentWithError:(NSError *)error;

/// Tells the delegate that the ad presented full screen content.
- (void)adDidPresentFullScreenContent:(id<GADFullScreenPresentingAd>)ad;

/// Tells the delegate that the ad dismissed full screen content.
- (void)adDidDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad;
```

## 4. 테스트 기기 등록

개발 중 상용 광고 키로 광고를 테스트하려는 경우 아래 단계에 따라 테스트 기기를 등록 후 사용해주시기 바랍니다.

{% hint style="danger" %}
테스트 기기 미등록 상태로 테스트할 경우 계정이 정지될 수 있습니다.
{% endhint %}

1\) ADXLibrary를 적용 후 광고를 로드하는 코드가 삽입된 상태로 실행해주시면 콘솔에서 해당 로그를 확인하실 수 있습니다.

```objectivec
<Google> To get test ads on this device, set: 
 GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ 
  @"aa20271272d6558e1bff61b329dd436c" 
 ];
```

2\) 출력된 Device ID를 복사하여 아래와 같이 `testDeviceIdentifiers`를 통해 테스트 기기를 등록해주시면 됩니다.

{% hint style="info" %}
앱을 출시하기 전에 이러한 테스트 기기를 설정하는 코드를 반드시 삭제하세요.
{% endhint %}

```objectivec
 GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ 
  @"aa20271272d6558e1bff61b329dd436c" 
 ];
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://platform-business.gitbook.io/adx/ios/sdk-integration/ad-formats/rewarded-ad-hidden/admob.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
