Google Admob을 사용해 앱에광고 띄워보기

kangYundol
daily-monster
Published in
14 min readJan 20, 2024

안녕하세요 일간 괴물의 토요 괴물입니다!

일간 괴물의 첫 게시글을 맡게 되어 설레면서도 긴장이 되네요,, ㅎㅎ

저희 일간 괴물은 iOS를 사랑하는 일곱명의 개발자들이 모여 하루에 하나씩 iOS 관련 포스팅을 할 예정입니다. iOS를 좋아하는 여러분 모두 함께해요~~

일간괴물의 첫 주제는 앱에서 google AdMod 사용하기 입니다!

사이드 프로젝트에 상업 광고를 붙이게 되었는데 그 과정을 공유해볼게요~

구글에서 제공하는 광고 플랫폼으로는 google ads, google adsense, google admob 세 가지가 있는데요, 저는 google admob을 선택했습니다!

google admob은 효율적인 광고 관리와 다양한 형태의 광고를 앱의 노출할 수 있도록 도와준다고 합니다.

세 플랫폼의 차이는 하단 링크를 참고해주세요!

https://the-mars.tistory.com/entry/Google-광고-플랫폼-구글애즈-구글애드센스-구글애드몹-비교

그럼 본격적으로 광고를 달아봅시다.

  1. 먼저 admob에서 앱을 생성합니다.

앱을 등록하려면 이미 앱 스토어에 등록이 되어야 있어야 합니다.

2. admob앱과 firebase 앱을 연동합니다.

이 과정은 광고를 붙이기 위한 필수 과정은 아닙니다.

해당 과정은 광고를 통한 사용자 측정항목을 보기 위한 과정인데요, 사용자 측정항목을 통해 수익 창출 전략을 파악하는데 도움이 될 수 있겠네요!

먼저 설정 > 연결된 서비스 > 내 앱의 사용자 측정항목을 설정으로 변경해줍니다.

이후 firebase에서 admob과 연동해주시면 되는데요

추가) 2024년 초부터는 사용자 측정항목을 on/off 하는 창이 사라진다고 합니다. 사용자 측정항목 데이터를 받고 싶으신 분들은 firebase에 앱을 연결하고 Firebase용 google analytics SDK를 앱에 통합해주세요.

firebase에 앱 연결하기

google analytics SDK를 앱에 통합하기

이제 Xcode를 켜주세요!

3. Info.plist에 GADApplicationIdentifier를 추가해줍니다.

GADApplicationIdentifier의 value값은 Google Admob > 앱 > 앱 설정 > 앱 ID를 넣어주시면 됩니다!

4. SDK 추가

미디에이션을 사용하는 경우는 Cocoa-Pod으로 추가해줍니다.

pod 'Google-Mobile-Ads-SDK'

미디에이션을 추후 사용할 계획이 없거나 자체 미디에이션 로직을 사용하는 경우에는 SPM(Swift-Package-Manager)로 추가해주어도 됩니다.

Project > Package Dependencies 에서 SDK를 추가해줍니다.

저는 SDK를 사용해 추가해주었어요!

새 프로젝트에 추가하는 경우 Up to Next Major Version를 선택해주세요!

5. 광고를 로드하기 전에 GADMobileAds.sharedInstance에서 startWithCompletionHandler: 메서드를 호출합니다.

이 메서드를 호출하면 SDK가 초기화되며 초기화가 완료되거나 제한 시간인 30초가 경과하면 completion handler가 콜백됩니다. 한 번만 호출하면 되지만, 최대한 빨리, 가급적 firebase를 초기화 한 후 앱 실행 시 호출하는 것이 좋다고 합니다!

⭐️ startWithCompletionHandler를 호출할 때 모바일 광고 SDK나 미디에이션 파트너 SDK에서 광고를 미리 호출할 수 있는데요. 단, 광고 호출 전 해야할 작업은 모바일 광고 SDK를 초기화 하기 전에 수행해야 하는게 좋습니다.

  • 유럽 경제 지역(EEA)에서 사용자 동의 얻기
  • 요청별 플래그 설정(예: tagForChildDirectedTreatment 또는 tag_for_under_age_of_consent)

startWithCompletionHandler가 정확히 어떤 역할을 하는지 자세히 알아볼게요!

startWithCompletionHandler는 AdMob 광고 서비스를 초기화하고, 광고 요청 및 표시를 가능하게 하는 초기화 프로세스를 시작하는 데 사용되는 메소드입니다.

크게 세 가지 역할을 수행하는데,

  1. 광고 초기화: 광고 주체(Ad Network)와 통신할 준비, 광고 노출 준비, 필요한 광고 자원 미리 로드
  2. 비동기 방식으로 초기화
  3. 초기화가 완료되면 completion handler 실행을 통해 성공 또는 오류 분기처리

와 같은 역할을 합니다.

startWithCompletionHandler는 광고 표시를 위한 필수적인 메서드이며 광고를 문제 없이 표시하고 최적화하는 역할을 수행합니다.

이제 AppDelegate에서 startWithCompletionHandler를 통해 SDK를 초기화해줍시다.

import Firebase
import GoogleMobileAds
...

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

// Use Firebase library to configure APIs.
FirebaseApp.configure()

// Initialize the Google Mobile Ads SDK.
GADMobileAds.sharedInstance().start(completionHandler: nil)

return true
}

}

여기까지 준비가 끝났습니다.

저희 앱에서는 전면광고를 넣기로 했기 때문에 전면광고를 띄워보도록 하겠습니다!

전면광고 구현

전면 광고:

사용자가 닫을 때까지 앱의 인터페이스를 완전히 덮는 전체 화면 광고

앱이 잠시 중단될 때 자연스럽게 광고 개제

기존 앱 화면 전체를 덮는 광고라고 생각하시면 되겠습니다!

광고를 구현해야할 때는 테스트 광고 ID를 사용해야한다고 합니다.

그렇지 않으면 admob 계정이 정지될 수 있대요.

전면 광고의 테스트 광고 ID는 ca-app-pub-3940256099942544/4411468910네요. 광고 형태에 따른 광고 ID는 아래와 같아요.

광고를 구현하는 단계는 3단계로 아주아주 간단합니다!!

  1. 광고 로드
  2. 콜백 등록
  3. 광고를 표시하고 보상 이벤트를 처리함

하나씩 차례차례 살펴봅시다.

광고로드

광고는 GADInterstitialAd 클래스의 정적 load(withAdUnitID:request:completionHandler: 메서드를 사용하여 로드됩니다.

load 메서드의 매개변수는 withAdUnitID, request, completionHandler로 세 개가 있습니다.

withAdUnitID: 광고 단위 ID

request: GADRequest 객체

completionHandler: 광고 로드에 성공 또는 실패 시 호출되는 핸들러

입니다.

GADInterstitialAd 객체는 completionHandler의 매개변수로 다시 전달되어요.

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

private var interstitial: GADInterstitialAd?

override func viewDidLoad() {
super.viewDidLoad()
let request = GADRequest()
GADInterstitialAd.load(withAdUnitID: "ca-app-pub-3940256099942544/4411468910", // testID
request: request,
completionHandler: { [self] ad, error in
if let error = error {
print("Failed to load interstitial ad with error: \(error.localizedDescription)")
return
}
interstitial = ad
}
)
}
}

콜백등록

GADFullScreenContentDelegate 프로토콜을 통해 전면광고 상태에 따라 콜백을 처리할 수 있습니다.

didFailToPresentFullScreenContentWithError: 전면 광고 로드가 실패했을 때

adWillPresentFullScreenContent: 전면 광고 로드를 성공하기 전

adDidDismissFullScreenContent: 전면 광고 로드를 종료한 후

interstitial?.fullScreenContentDelegate = self


extension ViewConroller: GADFullScreenContentDelegate {

/// Tells the delegate that the ad failed to present full screen content.
func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
print("Ad did fail to present full screen content.")
}

/// Tells the delegate that the ad will present full screen content.
func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("Ad will present full screen content.")
}

/// Tells the delegate that the ad dismissed full screen content.
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("Ad did dismiss full screen content.")
}

}

GADInterstitialAd는 일회용객체이므로 연속적인 광고를 원한다면 dismiss 부분에서 다른 전면광고를 로드할 수 있습니다.

광고 표시

이 부분은 googleAdmob 문서에서 제공되는 코드를 프로젝트에 맞게 조금 수정해보았는데요, 옵셔널 바인딩을 통해 광고가 로드 되었을 때만 화면전환이 이뤄지도록 코드를 수정했습니다.

private func pushToFullAd() {
guard let interstitial = self.interstitial else {
print("광고가 준비되지 않았습니다.")
return
}

dismiss(animated: true) {
interstitial.present(fromRootViewController: self)
}
}

그런데 .. 왜 광고가 로드가 되지 않을까요?

iOS 14.0 버전 이후

iOS 14버전 이후부터는 사용자의 앱 추적 권한에 따라 googleAdmobs 사용 여부가 달라진다고 합니다.

앱 추적 허용 권한을 얻기 위해서는 먼저

Targets > Builde Phases > Link Binary With Libraries로 가서 +를 눌러줍니다.

그리고 AppTrackingTransparency.framework를 추가해줍니다.

앱 추적 허용 요청은 앱을 설치한 후 최초 1회만 나타납니다. 거부를 누르면 앱을 삭제하고 다시 설치하기 전까지 나타나지 않아요!

그래도 설정에 가면 추적 권한을 변경할 수 있습니다 ㅎㅎ

ATTrackingManager.AuthorizationStatus는 앱 추적 허용 상태를 나타내는 상태값인데, 이 상태값은 앱 실행 시 requestTrackingAuthorization를 통해 사용자로부터 권한을 얻을 수 있습니다.

if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization { (status) in
switch status {
case .notDetermined:
print("notDetermined") // 결정되지 않음
case .restricted:
print("restricted") // 제한됨
case .denied:
print("denied") // 거부됨
case .authorized:
print("authorized") // 허용됨
@unknown default:
print("error") // 알려지지 않음
}
}
}

이후 허용 여부에 따라 GADMobileAds.sharedInstance().start(completionHandler: nil)를 호출하여 광고 기능을 추가할 수 있게됩니다.

아직 배포 전이므로 실제 광고를 사용할 수 없어 테스트 ID를 통해 광고 노출을 확인해보았는데요,

만약 시뮬레이터로 테스트 광고를 확인하신다면 시뮬레이터는 그 자체가 테스트 기기이므로 따로 설정해줄 필요는 없습니다!!

실제 기기로 빌드하는 경우에는 콘솔창에 아래와 같은 문구를 확인해보아야 합니다.

<Google> To get test ads on this device, set: 
GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ @"2639beba84197a1329a5b9a7c0563405" ];
GADMobileAds.sharedInstance().requestConfiguration.testDeviceIdentifiers = [ "2639beba84197a1329a5b9a7c0563405" ]

여기서 String으로 표현된 값이 바로 테스트 기기 ID입니다.

이 테스트 기기 ID는

GADMobileAds.sharedInstance().requestConfiguration.testDeviceIdentifiers = [ "89ad6e2f5e35327a7987a9a5dc2a1149" ]      // testID

이렇게 사용해주세요~

만약 실제 배포된 앱에 사용하려면

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

를 통해 GADMobileAds를 초기화 시켜주고

Info.plist에 GADApplicationIdentifier 값을 GoogleAdmobs에 있는 실제 앱 아이디를 넣어주면 됩니다.

참 쉽죠~?

그러면 짜잔~~ 광고가 나타납니다!

실제 앱을 배포할 때는 testID 부분을 수정해주고 올바른 ADMOB_APP_ID를 넣어주어야 한다는 것에 유의해주세요! 그럼 첫 번째 게시글을 마치도록 하겠습니다~!

다음주 토요일에 새로운 주제로 만나요~~

참고 링크:

https://firebase.google.com/docs/admob/ios/quick-start?hl=ko

https://the-mars.tistory.com/entry/Google-광고-플랫폼-구글애즈-구글애드센스-구글애드몹-비교

https://developers.google.com/admob/ios/interstitial?hl=ko

--

--