Google Admob을 사용해 앱에광고 띄워보기
안녕하세요 일간 괴물의 토요 괴물입니다!
일간 괴물의 첫 게시글을 맡게 되어 설레면서도 긴장이 되네요,, ㅎㅎ
저희 일간 괴물은 iOS를 사랑하는 일곱명의 개발자들이 모여 하루에 하나씩 iOS 관련 포스팅을 할 예정입니다. iOS를 좋아하는 여러분 모두 함께해요~~
일간괴물의 첫 주제는 앱에서 google AdMod 사용하기 입니다!
사이드 프로젝트에 상업 광고를 붙이게 되었는데 그 과정을 공유해볼게요~
구글에서 제공하는 광고 플랫폼으로는 google ads, google adsense, google admob 세 가지가 있는데요, 저는 google admob을 선택했습니다!
google admob은 효율적인 광고 관리와 다양한 형태의 광고를 앱의 노출할 수 있도록 도와준다고 합니다.
세 플랫폼의 차이는 하단 링크를 참고해주세요!
https://the-mars.tistory.com/entry/Google-광고-플랫폼-구글애즈-구글애드센스-구글애드몹-비교
그럼 본격적으로 광고를 달아봅시다.
- 먼저 admob에서 앱을 생성합니다.
앱을 등록하려면 이미 앱 스토어에 등록이 되어야 있어야 합니다.
2. admob앱과 firebase 앱을 연동합니다.
이 과정은 광고를 붙이기 위한 필수 과정은 아닙니다.
해당 과정은 광고를 통한 사용자 측정항목을 보기 위한 과정인데요, 사용자 측정항목을 통해 수익 창출 전략을 파악하는데 도움이 될 수 있겠네요!
먼저 설정 > 연결된 서비스 > 내 앱의 사용자 측정항목을 설정으로 변경해줍니다.
이후 firebase에서 admob과 연동해주시면 되는데요
추가) 2024년 초부터는 사용자 측정항목을 on/off 하는 창이 사라진다고 합니다. 사용자 측정항목 데이터를 받고 싶으신 분들은 firebase에 앱을 연결하고 Firebase용 google analytics SDK를 앱에 통합해주세요.
→ 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 광고 서비스를 초기화하고, 광고 요청 및 표시를 가능하게 하는 초기화 프로세스를 시작하는 데 사용되는 메소드입니다.
크게 세 가지 역할을 수행하는데,
- 광고 초기화: 광고 주체(Ad Network)와 통신할 준비, 광고 노출 준비, 필요한 광고 자원 미리 로드
- 비동기 방식으로 초기화
- 초기화가 완료되면 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단계로 아주아주 간단합니다!!
- 광고 로드
- 콜백 등록
- 광고를 표시하고 보상 이벤트를 처리함
하나씩 차례차례 살펴봅시다.
광고로드
광고는 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-광고-플랫폼-구글애즈-구글애드센스-구글애드몹-비교