# AdMob

## 1. 기본 요건

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

  {% hint style="danger" %}
  `GADApplicationIdentifier`를 추가하지 않으면 다음 메시지가 표시되며 앱이 비정상 종료됩니다.`The Google Mobile Ads SDK was initialized incorrectly.`

  ***

  ```
  <key>GADApplicationIdentifier</key>
  <string>ADMOB_APP_ID</string>
  ```

  {% endhint %}

## 2. 구현

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

1. `GADRequest`를 생성합니다.
   * GDPR 관련 규정을 준수하는 경우, 사용자가 개인정보 활용 및 수집을 거부한 상태(`ADXConsentStateDenied`)일 때 `npa`를 `1`로 추가합니다.
2. `GADRewardedAd` 의 `loadWithAdUnitID:request:completionHandler:` 메서드로 광고를 로드합니다.
3. &#x20;광고 로드가 완료되면 `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`는 **일회용 객체**로 보상형 광고가 표시된 후에는 다시 표시되지 않습니다.&#x20;

이전 광고가 닫힌 직후 다음 보상형 광고가 로드될 수 있도록 `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" 
 ];
```
