본문 바로가기

iOS

앱 수익화 - SwiftUI 앱에 광고넣기(AdMob vs Meta Audience Network)

앱의 수익화는 앱을 유지하기 위해 정말 중요한 부분이라고 생각한다. 그래서 SeoulSalam에도 Google Admob을 이용해 광고를 게재중

 

iOS 앱에 광고를 게재 하는 방법은 여러가지인데, 그 중 가장 인기있는 것은 Google Admob이다.

이전에는 애플에서 직접운영하는 iAD도 있었지만, deprecated 되었고, Amazon  Mobile Ads도 몇 년 전에 deprecated되었다.

 

Meta Audience Network 또한 사용되지만, 필자 개인적인 경험으로는 TIN을 요구하는 것도 그렇고, 계좌 연결 그리고 앱 인증까지 Google AdMob 보다는 더 복잡한 부분이 있었다.

 



위 인증 상황을 해결하는 데에까지 총 7일 이상의 시간이 소요되었기 때문에, 그 사이에 AdMob인증이 완료되어 그쪽을 사용하는 것으로 했다.

 

따라서 지금부터 AdMob 연동을 설명하도록 하겠다.

 

우선 회원가입과 로그인을 끝내면 다음과 같은 메뉴를 좌측에서 볼 수 있다.

 

 

여기서 앱 추가를 하도록 하자. 그러면 플랫폼(iOS, 안드로이드)를 물어보고, 앱스토어에 이미 등록된 앱인지 물어볼 것이다. 지금 되어있지 않더라도 미리 광고단위를 만들고 test를 할 수 있기에, 현 시점에서 가능한 메뉴로 바로 만들어두도록 하자. 만약에 등록되어있는 앱이라면,  앱 이름으로 바로 접근할 수 있다. 

 

그 후엔 광고 단위로 들어가 광고 단위 추가를 하도록 하자.

 

1번 이미지

 

그러면 다음과 같은 종류의 광고 단위를 제시해준다.

 

2번 이미지

 

그렇게 되면 1번 이미지도 돌아오게 되어서 광고단위의 이름 밑에 'ca-app-pub-000000000000' 형태로 아이덴티파이어가 생성이 될것이다.

 

그 후엔 Xcode를 켜준뒤에

 

SPM을 이용해 Google-Mobile-Ads-SDK를 추가해주고, Info를 SourceCode로 열어주자!

 

 

그리고 Info 에 아이덴티파이어를 다음과 같이 추가해주자.

 

<key>GADApplicationIdentifier</key>
<string>ca-app-pub-000000000~00000000</string>

 

그리고 다음과 같이 App파일에 완료핸들러를 호출하도록 합시다.

 

import GoogleMobileAds 
 
 //...
 
 init() {
        GADMobileAds.sharedInstance().start(completionHandler: nil)
    }
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }

 

그리고 다음의 코드로 BannerAd 구조체를 만들어줬다. (함수로 배너 뷰를 생성해주는 코드도 있기도 하고 여러가지가 있으나, 필자는 개인적으로 이게 제일 편했다) 작성한지 몇달이 된 코드이기 때문에 참고한 출처도 같이 표시하고 싶으나 기억이 안나는 점 양해부탁드립니다...ㅜㅜ

 

import SwiftUI
import GoogleMobileAds

struct BannerAd: UIViewRepresentable{
    
    var unitID: String
    
    func makeCoordinator() -> Coordinator {
        return Coordinator()
    }
    
    func makeUIView(context: Context) -> GADBannerView{
        
        let adView = GADBannerView(adSize: GADAdSizeBanner)
        
        adView.adUnitID = unitID
        adView.rootViewController = UIApplication.shared.getRootViewController()
        adView.delegate = context.coordinator
        adView.load(GADRequest())
        
        return adView
    }
    
    func updateUIView(_ uiView: GADBannerView, context: Context) {
        
    }
    
    class Coordinator: NSObject, GADBannerViewDelegate {
        
        func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
          print("bannerViewDidReceiveAd")
        }

        func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
          print("bannerView:didFailToReceiveAdWithError: \(error.localizedDescription)")
        }

        func bannerViewDidRecordImpression(_ bannerView: GADBannerView) {
          print("bannerViewDidRecordImpression")
        }

        func bannerViewWillPresentScreen(_ bannerView: GADBannerView) {
          print("bannerViewWillPresentScreen")
        }

        func bannerViewWillDismissScreen(_ bannerView: GADBannerView) {
          print("bannerViewWillDIsmissScreen")
        }

        func bannerViewDidDismissScreen(_ bannerView: GADBannerView) {
          print("bannerViewDidDismissScreen")
        }
    }
}

extension UIApplication{
    func getRootViewController() -> UIViewController{
        guard let screen = self.connectedScenes.first as? UIWindowScene else{
            return .init()
        }
        
        guard let root = screen.windows.first?.rootViewController else{
            return .init()
        }
        
        return root
    }
}

 

그리고 불러오고 싶은 뷰에서

 

BannerAd(unitID: "ca-app-pub-00000000000/0000000")
     .frame(height: 50)

 

위와같은 코드로 불러와준다면, 

 

 

다음과 같이 테스트 버전으로 성공한 것을 볼 수 있다.

 

사실 캡쳐화면이 테스트모드인 데에는 이유가 있는데......

필자가 SeoulSalam 2.0 출시를 준비하면서 admob관련해서 실제 앱에서 어떻게 넘어가는지 테스트를 했었고...2~3번의 탭이 이어지자..

 

 

광고 Ban을 받아버렸다...ㅜㅜㅜㅜ

 

그렇게 이번달 0달러 기록...

 

대략 한 달 넘게 걸린다는데....제발 돌아와줬으면 좋겠다...ㅠ