這篇是一個簡單介紹 UIViewControllerRepresentable 的範例,
由於 Google AdMob 的 GADBannerView 不像上次提及的 UITextField 一樣,可以直接使用 UIViewRepresentable 來包裝;原因是它必須設置一個 rootViewController,也就意味著我們需要使用 UIViewControllerRepresentable 才能完成它。

Interfacing with UIKit

透過這個 Apple 官方的教學當中,我們可以從 UIPageViewController 的範例來做發想,故我的實作方式會是這樣:

import GoogleMobileAds
import SwiftUI
import UIKit

struct GADBannerViewController: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> UIViewController {
        let view = GADBannerView(adSize: kGADAdSizeBanner)
        let viewController = UIViewController()
        view.adUnitID = "your ad unit id in there."
        view.rootViewController = viewController
        viewController.view.addSubview(view)
        viewController.view.frame = CGRect(origin: .zero, size: kGADAdSizeBanner.size)
        view.load(GADRequest())
        return viewController
    }

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

如果需要處理 Delegate 的部分

你可以參閱上次 TextField 的處理方式,建構一個 Coordinator 來進行相關的作業👌

如果還有問題的話

歡迎直接透過各種方式找到我,一起來討論討論 SwiftUI 的應用👍
程式碼會同步到 GitHub 上,有任何想法都可以直接留言📒

轉載請注明轉自: Archie  , 本文固定鏈接: SwiftUI + Google AdMob

  1. Ironball's avatar
    Ironball 發表於 2019-09-30 1:58:01 回復 #1

    您好~想詢問如果是 插頁式廣告、獎勵式廣告改如果用在 SwiftUI上呢~

    我照Admob官方文件測試~

    import SwiftUI
    import GoogleMobileAds

    struct ContentView: View {
    var interstitial: GADInterstitial! = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")

    var body: some View {
    Text("Test123")
    .onAppear{
    let request = GADRequest()
    self.interstitial.load(request)
    if self.interstitial.isReady {
    interstitial.present(fromRootViewController: self)

    } else {
    print("Ad wasn't ready")
    }
    }
    }
    }

    但是 interstitial.present(fromRootViewController: self) 會報錯~

    Cannot convert value of type 'ContentView' to expected argument type 'UIViewController'

    不知有沒有好的解決方法~😂

    • Archie's avatar
      發表於 4 週前 回復

      @Ironball:這方面我還沒有實作的經驗,等之後有處理到的話再上來分享🙏

Bitnami