'interstitial'에 해당되는 글 1건

  1. 2016.10.25 [Admob] 앱 실행시 전면광고 실행
Programming/iOS2016.10.25 23:46

앱을 실행해면 전면 광고를 실행해서 보여주게 하였다. 


그러던 중 admob 으로 부터 메일 한통을 받았다.



경고를 받은 앱은 Android 앱이었지만 iOS에서도 동일한 방식으로 나오고 있었다. 


iOS도 수정이 필요한 상황이었다. 그래서 정책을 알아 보기로 했다. 여러 가지 정책이 있어서 모든 것을 다 소개할 수도 없고 내가 필요한 것은 기존 상태를 유지하면서 고칠 수 있는 방법이었다.


https://support.google.com/admob/answer/6201362?hl=ko&ref_topic=2745287


`예기치 않게 실행되는 삽입 광고` > `허용되지 않는 광고 구현의 예: 앱을 열 때 삽입 광고 실행` 


이 경우가 경고를 받았을 때의 경우이다. 


이걸 이제 어떻게 수정해야 할까..



이 방법대로 해보자~!!!


iOS Launch screen 이 나오고 메인 화면이 나오기 전에 광고가 떠야 한다.


그렇다면... AppDelegate 의 didFinishLaunchingWithOptions 에서 띄우면 될것 같아!


1. AppDelegate 에서 전면광고 띄우기


import GoogleMobileAds

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GADInterstitialDelegate {

    var window: UIWindow?
    var interstitial: GADInterstitial?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        interstitial = GADInterstitial(adUnitID: "********")

        let request = GADRequest()
        // Requests test ads on test devices.
        interstitial?.load(request)

        return true
    }

    func interstitialDidReceiveAd(_ ad: GADInterstitial!){
        guard let viewController = window?.rootViewController else { return }
        ad.present(fromRootViewController: viewController)
    }
}

앱 실행시 광고를 띄우는 코드는 모두 작성되었다. 이제 실행을 해보자~!



음...? 메인화면이 먼저 뜨고 전면광고가 뜬다. 위에 안 되는 경우가 바로 이런 경우이다.


이렇게 하면 정지를 받을게 뻔하다... 이건 아님...



전면광고를 로딩하는 시간 때문에 어쩔 수 없이 메인 화면이 노출되는 것 같다. 그러면... 만족스럽지 못하지만 자주 쓰는 방법으로 페이크 LaunchScreen 을 이용해 보자. 


Launch screen 과 같은 VC를 바로 띄워서 전면고를 보여주면...? 문제가.. 없겠는데?!! 그리고 전면광고를 닫을때 메인 화면으로 이동해주자.


2. Fake launch screen 을 이용하여 전면광고 띄우기


import GoogleMobileAds

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GADInterstitialDelegate {

    var window: UIWindow?
    var interstitial: GADInterstitial?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        if let viewController = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController() {
            window?.rootViewController = viewController
        }

        interstitial = GADInterstitial(adUnitID: "******")
        interstitial?.delegate = self

        let request = GADRequest()
        interstitial?.load(request)

        return true
    }

    func interstitialDidReceiveAd(_ ad: GADInterstitial!){
        guard let viewController = window?.rootViewController else { return }
        ad.present(fromRootViewController: viewController)
    }

    func interstitialWillDismissScreen(_ ad: GADInterstitial!) {
        if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() {
            window?.rootViewController = viewController
        }
    }
}

이렇게 하면 완벽히 동작할 것이다. 이제 전면광고로 부터 자유로워 질 것이다.


실행을 해보자. 밑에 동영상을 확인해 보자.




우리가 원하는 동작이다!! 와우~!!


그런데 뭔가가... 좀... 부족하다..


전면 광고가 사라지는 애니메이션이 사라졌다. willDismiss에서 rootViewController를 변경해서 그런가 보다..


그렇다고 didDismiss 에서 rootViewController 를 변경하면 애니메이션이 끝나기 전까지 전면광고가 보인다. 이렇게 하면 다음과 같은 경우로 허용되지 않는다.



Launch screen에서 광고를 띄워야 하는 것은 유지되어야 하고 광고가 사라지는 애니메이션이 유지되면서 메인화면이 보여야 한다. 


일단 window의 rootViewController를 변경하면 애니메이션을 유지하지 못한다. rootViewController를 변경하는 방법을 제외한다.


그럼... Launch screen 을 VC 형태로 하는게 아니라 view 로 보여주는건 어떨까? view면 바로 추가하고 제거하면 되지 않을까?


음? 그럴듯하다. 한번 해보자. 생각하면 답이 안 나온다. 일단 삽질하다 보면 답이 나오겠지. 어서 해보자.


import GoogleMobileAds

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GADInterstitialDelegate {

    var window: UIWindow?
    var interstitial: GADInterstitial?
    var launchScreenView: UIView?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        if let view = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController()?.view {
            launchScreenView = view
            view.translatesAutoresizingMaskIntoConstraints = false
            
            if let rootView = window?.rootViewController?.view {
                rootView.addSubview(view)
                
                var constraints = [NSLayoutConstraint]()
                constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|", options: [], metrics: nil, views: ["view": view])
                constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]-0-|", options: [], metrics: nil, views: ["view": view])
                rootView.addConstraints(constraints)
            }
        }

        interstitial = GADInterstitial(adUnitID: "******")
        interstitial?.delegate = self

        let request = GADRequest()
        interstitial?.load(request)

        return true
    }

    func interstitialDidReceiveAd(_ ad: GADInterstitial!){
        guard let viewController = window?.rootViewController else { return }
        ad.present(fromRootViewController: viewController)
    }

    func interstitialWillDismissScreen(_ ad: GADInterstitial!) {
        launchScreenView?.removeFromSuperview()
    }
}


후후 코드는 완벽하다.


이제 실행 동영상을 보자.





완벽하게 내가 원했던 동작이다.


축하~ 축하!!



여러분의 광고 수익에 조금이나마 도움이 되었으면 좋겠다.





신고
Posted by 초프(초보 프로그래머)