SwiftUI로 AdMob 대응(배너편)

요약



UIViewControllerRepresentable을 사용하여 SwiftUI에서 좋은 느낌에 배너가 포함된 화면을 표시합니다.

소개



SwiftUI에서 AdMob 배너를 표시하고 싶었으므로 구현해 보았습니다.
AdMob의 도입이 끝난 것이 전제가 됩니다.
htps : //에서 ゔぇぺぺrs. 오, ぇ. 이 m / 아 d도 b / 이오 s / 쿠이 ck-s rt? hl = 그럼

결과



이런 식으로 프리뷰로 배너를 표시할 수 있었습니다.



리포지토리



개요



SwiftUI에서 AdMob을 지원합니다.
시작에 배너를 표시합니다.

Life Cycle SwiftUI App 지원



리포지토리에서 프로젝트는 SwiftUI App의 프로젝트가 됩니다.
AdMob은 AppDelegate에서 GADMobileAds.sharedInstance().start(completionHandler: nil)를 초기화해야하기 때문에 시간이 필요합니다.

AppDelegate를 만들고 프로젝트의 App에 UIApplicationDelegateAdaptor를 추가하여 AppDelegate 내에서 초기화합니다.
@main
struct SwiftUIAdMobApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        GADMobileAds.sharedInstance().start(completionHandler: nil)
        return true
    }
}

UIViewControllerRepresentable로 광고 표시용 UIViewController 만들기



AdMob 배너에는 광고 처리를 위한 전체 화면 rootViewController가 필요합니다.
SwiftUI 단독으로는 UIViewController를 준비할 수 없기 때문에, 이것을 UIViewControllerRepresentable 경유로 준비합니다.

ContainedAdViewController에서 UIViewControllerRepresentable에 적합한 처리를 작성합니다.makeUIViewController 에서 제공하는 UIViewController 는 Storyboard 에서 준비했습니다.
struct ContainedAdViewController<Content: View>: UIViewControllerRepresentable {
    let rootView: Content

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: Context) -> UIViewController {
        let adViewController: AdViewController = UIStoryboard(name: "AdViewController", bundle: nil).instantiateInitialViewController()!
        adViewController.rootView = AnyView(rootView)
        return adViewController
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {

    }

    typealias UIViewControllerType = UIViewController

    class Coordinator: NSObject {
        var parent: ContainedAdViewController

        init(_ containedAdViewController: ContainedAdViewController) {
            parent = containedAdViewController
        }
    }
}


Storyboard의 초기 표시는 AdViewController라고 하는 UIViewController 상속 클래스로, 그 내부에서는 SwiftUI를 표시하는 UIHostingController 컨테이너와 그 아래에서 표시를 하는 배너를 포함하고 있습니다.
광고 배너에 대한 rootViewController는 AdViewController입니다.



SwiftUI 측 표시



SwiftUI 측은 ContainedAdViewController의 rootView에 표시하고 싶은 View를 구현하면 OK입니다.
struct ContentView: View {
    var body: some View {
        ContainedAdViewController(rootView:
                                    Text("Hello, world!").padding()
        )

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


동작



볼 수 있었습니다.


위의 Repository 코드는 Scene도 지원하므로 여러 화면에서도 적응형 광고를 볼 수 있습니다.

좋은 웹페이지 즐겨찾기