【问题标题】:Google Ads 8.0 Interstitial SwiftUIGoogle Ads 8.0 插页式 SwiftUI
【发布时间】:2021-05-11 15:12:04
【问题描述】:

似乎没有很多将 Google MobileAdsSDK 8.0 (iOS) 与 SwiftUI 结合使用的示例。 到目前为止,我有一堂课Interstitial

import GoogleMobileAds
import UIKit
    
final class Interstitial:NSObject, GADFullScreenContentDelegate{
    var interstitial:GADInterstitialAd!
    
    override init() {
        super.init()
        LoadInterstitial()
    }
    
    func LoadInterstitial(){
        let req = GADRequest()
        GADInterstitialAd.load(withAdUnitID: "...", request: req) { ad, error in
            self.interstitial = ad
            self.interstitial.fullScreenContentDelegate = self
        }
        
    }
    
    func showAd(){
        if self.interstitial != nil {
            let root = UIApplication.shared.windows.first?.rootViewController
            self.interstitial.present(fromRootViewController: root!)
        }
    }
    
    
    func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
        LoadInterstitial()
    }
}

在我的 SwiftUI 视图中,我创建了一个局部变量 Interstitial,并在执行操作时调用 showAd() 函数,但是当广告显示时,它会在 showAd() 调用运行后立即停止代码。所以我认为我需要以某种方式调用showAd(),一旦广告被关闭,然后在视图中执行我的其余代码。正如您在上面看到的 Interstitial 类是委托,但我如何“提醒”我的 SwiftUI 视图广告已被关闭,以便我可以执行其余代码?以下是我的观点。

import SwiftUI

struct MyView: View {
    
    @Environment(\.managedObjectContext) var managedObjectContext

    var interstitial : Interstitial = Interstitial()

    
    var body: some View {
        VStack{
            //... Display content
        }
        .navigationBarItems(trailing:
            HStack{
                Button(action: actionSheet) {
                    Image(systemName: "square.and.arrow.up")
                }
                
            }
        )
    }
    
    func showAd(){
        interstitial.showAd()
    }
    
    func actionSheet() {
        showAd()
        let data = createPDF()
        let temporaryFolder = FileManager.default.temporaryDirectory
        let fileName = "export.pdf"
        let temporaryFileURL = temporaryFolder.appendingPathComponent(fileName)
        do {
            try data.write(to: temporaryFileURL)
            let av = UIActivityViewController(activityItems: [try URL(resolvingAliasFileAt: temporaryFileURL)], applicationActivities: nil)
            UIApplication.shared.windows.first?.rootViewController?.present(av, animated: true, completion: nil)

        } catch {
            print(error)
        }
    }
    
}

【问题讨论】:

    标签: swiftui admob swift5 googlemobileads


    【解决方案1】:

    通过添加一个 excaping 闭包,您可以传递一个函数并执行所需的操作。

    final class InterstitialAd: NSObject, GADFullScreenContentDelegate {
        var completion: () -> Void
        var interstitial: GADInterstitialAd!
        
        init(completion: @escaping () -> Void) {
            self.completion = completion
            
            super.init()
            
            LoadInterstitialAd()
        }
        
        func LoadInterstitialAd() {
            let req = GADRequest()
            GADInterstitialAd.load(withAdUnitID: Constants.AdmobIDs.saveImageBlockID, request: req) { ad, error in
                self.interstitial = ad
                self.interstitial.fullScreenContentDelegate = self
            }
            
        }
        
        func show() {
            if self.interstitial != nil {
                let root = UIApplication.shared.windows.first?.rootViewController
                self.interstitial.present(fromRootViewController: root!)
            }
        }
        
        
        func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
            LoadInterstitialAd()
            completion()
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      相关资源
      最近更新 更多