iOS AdMob 광고와 화면 방향 제어 시 발생하는 문제와 해결책
안녕하세요! 오늘은 iOS 앱 개발 중 AdMob 전면 광고(Interstitial Ad)와 화면 방향 제어를 함께 사용할 때 발생하는 흥미로운 문제를 발견해서 공유하려고 합니다.
🔍 문제 발견
최근 화면 방향을 동적으로 제어하는 기능과 AdMob 광고를 함께 구현하던 중, 예상치 못한 문제를 발견했습니다.
문제 상황:
- 가로 방향 고정 상태에서 광고를 로드
- 세로 방향 고정 상태로 변경 후 광고 표시 시도
- 결과: 광고 표시 실패! 😱
그 반대 상황도 마찬가지였습니다.
🧪 테스트 환경 구성
문제를 정확히 파악하기 위해 테스트용 플레이그라운드 앱을 만들어봤습니다.
주요 기능
- 세로/가로/전체 방향 동적 전환
- AdMob 전면 광고 로드/표시
- Toast 메시지로 상태 피드백
핵심 구현 코드
AppDelegate에서 방향 제어:
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var orientationLock: UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return orientationLock
}
}
ViewController에서 동적 방향 변경:
@objc
private func didTappedPortraitButton() {
appDelegate.orientationLock = .portrait
setNeedsUpdateOfSupportedInterfaceOrientations()
view.showToast(message: "세로 모드로 고정되었습니다")
}
📊 테스트 결과
여러 시나리오를 테스트한 결과, 다음과 같은 패턴을 발견했습니다:
광고 로드 시점 방향 | 광고 표시 시점 방향 | 결과 |
---|---|---|
세로 고정 | 세로 고정 | ✅ 성공 |
가로 고정 | 가로 고정 | ✅ 성공 |
세로 고정 | 가로 고정 | ❌ 실패 |
가로 고정 | 세로 고정 | ❌ 실패 |
전체허용일 때는 로드 시점에 현재 화면이 가로 방향인지, 세로 방향인지에 따라 다른 방향으로 고정하게 되면 노출에 실패하였습니다.
💭 원인 분석
이 문제가 발생하는 이유를 분석해보니, AdMob SDK가 광고 로드 시점의 화면 방향 설정을 기준으로 광고 레이아웃을 미리 구성하기 때문일 것으로 추측됩니다.
즉, 세로 방향용으로 로드된 광고를 가로 방향에서 표시하려고 하면 레이아웃 불일치로 인해 표시에 실패하는 것으로 보입니다.
🛠 해결책
이 문제를 해결하기 위한 몇 가지 방법으로 구현하면 해결할 수 있을 것으로 추측됩니다.
1. 동일한 방향에서 로드/표시
// 광고 표시 전에 로드 시점과 동일한 방향으로 설정
func showAdWithOrientationCheck() {
// 광고가 로드된 방향으로 먼저 변경
appDelegate.orientationLock = adLoadedOrientation
setNeedsUpdateOfSupportedInterfaceOrientations()
// 잠시 후 광고 표시
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.interstitialAd?.present(from: self)
}
}
2. 광고 표시 전 전체 방향 허용
func showAdSafely() {
// 임시로 모든 방향 허용
let previousOrientation = appDelegate.orientationLock
appDelegate.orientationLock = .all
interstitialAd?.present(from: self)
// 광고 종료 후 원래 설정 복원
// (FullScreenContentDelegate에서 처리)
}
3. 방향별 광고 인스턴스 관리
class AdManager {
private var portraitAd: GADInterstitialAd?
private var landscapeAd: GADInterstitialAd?
func loadAd(for orientation: UIInterfaceOrientationMask) {
// 방향별로 별도 광고 인스턴스 관리
}
}
🎯 실제 적용 시 고려사항
실제 앱에 적용할 때는 다음 사항들을 고려해야 합니다:
- 사용자 경험: 광고 표시를 위해 방향이 갑자기 바뀌면 사용자가 당황할 수 있습니다.
- 성능: 방향별로 광고를 따로 로드하면 네트워크 사용량이 증가합니다.
- 광고 정책: AdMob 정책에 위배되지 않도록 주의해야 합니다.
🔗 참고 자료
이 테스트를 위해 만든 플레이그라운드 프로젝트는 GitHub에서 확인하실 수 있습니다.
프로젝트에는 다음 기능들이 구현되어 있습니다:
- 스토리보드 없는 완전 코드 기반 UI
- SnapKit을 활용한 Auto Layout
- Toast 메시지 시스템
- 방향 제어 및 광고 통합 테스트
🤔 마무리
이번 발견을 통해 AdMob 광고와 화면 방향 제어를 함께 사용할 때 주의해야 할 점을 알게 되었습니다.
비슷한 문제를 겪고 계신 분들이나 더 좋은 해결책을 아시는 분들의 의견을 댓글로 공유해주시면 감사하겠습니다!
다음에는 이 문제를 근본적으로 해결하는 더 나은 방법을 찾아서 공유해보겠습니다. 😊
'iOS' 카테고리의 다른 글
XcodeBuildMCP 연동 및 Xcode 없이 시뮬레이터 빌드 실행 (2) | 2025.07.07 |
---|