iOS/swift

25. [iOS/Swift] AdMob Rewarded (보상형) 광고 구현하기 (Google-Mobile-Ads-SDK 8.13.0)

drizzle0925 2021. 12. 10. 16:40
728x90

리워드 광고 아이디 만들기

Admob 사이트로 이동해서 리워드 광고 아이디를 만들겠습니다.

https://admob.google.com/

 

Google AdMob: 모바일 앱 수익 창출

인앱 광고를 사용하여 모바일 앱에서 더 많은 수익을 창출하고, 사용이 간편한 도구를 통해 유용한 분석 정보를 얻고 앱을 성장시켜 보세요.

admob.google.com

 

시작하기를 클릭합니다.

 

 

앱 클릭 > TestBannerAdApp 클릭

(AdMod 배너 광고를 구현할 때 만들 앱이 있어서 이 앱을 선택하겠습니다. 앱이 없으신 분들은 앱 추가를 클릭하셔서 앱을 생성하시면 됩니다. 앱 추가 방법은 AdMob배너 광고 구현을 참고하시면 됩니다.)

 

광고 단위 클릭 > 광고 단위 추가 클릭

 

보상형 전면 광고 선택 클릭

 

광고 단위 이름을 입력 > 광고 단위 만들기 클릭

(리워드 수량은 보상형 광고 시청시 지급할 수치를 설정하는 란입니다.)

 

완료를 클릭합니다.

(1과 2에 있는 아이디는 기능 구현시 필요하므로 잘 보관합니다. 메모하지 않아도 나중에 확인하는 것도 가능합니다.)


xcode에서 프로젝트 생성하기

 

App 선택 > Next 클릭

 

Product Name 입력 > Next 클릭

 

터미널을 열어 RewardedAd 폴더로 이동 > 아래 명령어로 코코팟을 초기화합니다. 

pod init

 

Podfile을 열어 수정합니다.

open Podfile

 

다음 코드를 추가하고 저장합니다.

pod 'Google-Mobile-Ads-SDK'

 

파일을 저장했다면 터미널로 돌아와 아래 명령어를 입력합니다.

// Macbook
pod install

// Macbook M1
arch -x86_64 pod install --repo-update

 

 

.xcworkspace로 된 파일을 xcode로 엽니다.

 

AppDelegate.swift 파일을 열어 아래 코드를 추가합니다.

import GoogleMobileAds
...

GADMobileAds.sharedInstance().start(completionHandler: nil)

 

 

Main으로 이동후 ViewController에 버튼을 추가합니다.

 

 

버튼의 클릭 이벤트를 생성합니다.

 

아래 코드를 입력합니다.

import UIKit
import GoogleMobileAds

class ViewController: UIViewController, GADFullScreenContentDelegate {
    
    // The rewarded video ad
    var rewardedAd: GADRewardedAd?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    fileprivate func loadRewardVideoAd() {
        GADRewardedAd.load(withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest())  { (ad, error) in
            
          if let error = error {
            print("오류로 인해 보상광고를 로드하지 못했습니다 : \(error.localizedDescription)")
            return
          }
            
          print("보상광고가 로드되었습니다.")
          self.rewardedAd = ad
          self.rewardedAd?.fullScreenContentDelegate = self
        }
      }
    
    func presentRewardVideo() {
       DispatchQueue.background(background: {
           // do something in background
           self.loadRewardVideoAd()

       }, completion:{
           // when background job finished, do something in main thread
           if let ad = self.rewardedAd {
              // reward the user
              ad.present(fromRootViewController: self) {
                  print("보상 지급 : \(ad)")
            }
             
            } else {
               
             // the Ad failed to present .. show alert message
             let alert = UIAlertController(title: "알림", message: "보상광고 정보를 불러오고 있습니다.\n잠시 후에 다시 시도해 주세요.",preferredStyle: .alert)
             let alertAction = UIAlertAction(title: "OK", style: .cancel, handler: { [weak self] action in
                 self?.loadRewardVideoAd()
             })
             alert.addAction(alertAction)
             self.present(alert, animated: true, completion: nil)
           }
       })
    }
    
    @IBAction func playRewardedAdBtn(_ sender: Any) {
        presentRewardVideo()
    }
}

extension DispatchQueue {
    static func background(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) {
        DispatchQueue.global(qos: .background).async {
            background?()
            if let completion = completion {
                DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
                    completion()
                })
            }
        }
    }
}

 

결과물

 

728x90