单独 Controller 中的 iOS admob 横幅 - testDevices id 最佳实践?

标签 ios swift admob

我在我的 Swift iOS 项目的 View Controller 中实现了一个智能横幅广告,它似乎运行良好。代码如下:

let bannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)

self.view.addSubview(bannerView)

bannerView.delegate = self
bannerView.adUnitID = "ca-app-pub-xyz..."
bannerView.rootViewController = self

let request = GADRequest()
request.testDevices = [kGADSimulatorID, "my-iphone-device-id"]
bannerView.load(request)

我现在想在我项目的另一个 View Controller 中做同样的事情。最简单的解决方案是将上面的代码简单地复制粘贴到新的 Controller 中,这样就可以正常工作。

我不想这样做,因为我的 iPhone "my-iphone-device-id" 的测试 ID 字符串有多个副本似乎不是最佳做法。有没有更好的方法来存储此 ID,以便我的项目中的所有 Controller 都可以访问它,而无需在各处复制粘贴该字符串?

最佳答案

在整个应用程序中使用此类集中广告横幅

如何使用

// Set bannerViewAdUnitID = Your Banner Id First in below class

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        SwiftyAd.shared.showBanner(from: self)
    }

//
//  SwiftyAd.swift
//  AdTest
//
//  Created by Satish on 9/3/17.
//  Copyright © 2017 Satish. All rights reserved.
//

import GoogleMobileAds

/// LocalizedString (todo)
private enum LocalizedString {
    static let sorry = "Sorry"
    static let ok = "OK"
    static let noVideo = "No video available to watch at the moment."
}

/// SwiftyAdsDelegate
protocol SwiftyAdDelegate: class {
    /// SwiftyAd did open
    func swiftyAdDidOpen(_ swiftyAd: SwiftyAd)
    /// SwiftyAd did close
    func swiftyAdDidClose(_ swiftyAd: SwiftyAd)
    /// SwiftyAd did reward user
    func swiftyAd(_ swiftyAd: SwiftyAd, didRewardUserWithAmount rewardAmount: Int)
}

/**
 SwiftyAd

 A helper class to manage adverts from AdMob.
 */
final class SwiftyAd: NSObject {

    /// Banner position
    enum BannerPosition {
        case bottom
        case top
    }

    // MARK: - Static Properties

    /// Shared instance
    static let shared = SwiftyAd()

    // MARK: - Properties

    /// Delegates
    weak var delegate: SwiftyAdDelegate?

    /// Remove ads
    var isRemoved = false {
        didSet {
            guard isRemoved else { return }
            removeBanner()
        }
    }


    /// Ads
    fileprivate var bannerViewAd: GADBannerView?


    /// Test Ad Unit IDs. Will get set to real ID in setup method
    fileprivate var bannerViewAdUnitID = "***********YOUR ID******"

    /// Interval counter
    private var intervalCounter = 0

    /// Reward amount backup
    fileprivate var rewardAmountBackup = 1

    /// Banner position
    fileprivate var bannerPosition = BannerPosition.bottom

    /// Banner size
    fileprivate var bannerSize: GADAdSize {
        let isLandscape = UIApplication.shared.statusBarOrientation.isLandscape
        return isLandscape ? kGADAdSizeSmartBannerLandscape : kGADAdSizeSmartBannerPortrait
    }

    // MARK: - Init

    /// Init
    private override init() { }



    // MARK: - Show Banner

    /// Show banner ad
    ///
    /// - parameter viewController: The view controller that will present the ad.
    /// - parameter position: The position of the banner. Defaults to bottom.
    func showBanner(from viewController: UIViewController, at position: BannerPosition = .bottom) {
        guard !isRemoved else { return }
        bannerPosition = position
        loadBannerAd(from: viewController)
    }



    // MARK: - Remove Banner

    /// Remove banner ads
    func removeBanner() {
        print("Removed banner ad")

        bannerViewAd?.delegate = nil
        bannerViewAd?.removeFromSuperview()
        bannerViewAd = nil
    }

    // MARK: - Update For Orientation

    /// Handle orientation chang
    func updateOrientation() {
        print("AdMob banner orientation updated")
        guard let bannerViewAd = bannerViewAd else { return }
        bannerViewAd.adSize = bannerSize
        setBannerToOnScreenPosition(bannerViewAd, from: bannerViewAd.rootViewController)
    }
}

// MARK: - Requesting Ad
private extension SwiftyAd {

    /// Load banner ad
    func loadBannerAd(from viewController: UIViewController) {
        print("AdMob banner ad loading...")

        bannerViewAd?.removeFromSuperview()
        bannerViewAd = GADBannerView(adSize: bannerSize)

        guard let bannerViewAd = bannerViewAd else { return }

        bannerViewAd.adUnitID = bannerViewAdUnitID
        bannerViewAd.delegate = self
        bannerViewAd.rootViewController = viewController
        bannerViewAd.isHidden = true
        setBannerToOffScreenPosition(bannerViewAd, from: viewController)

        viewController.view.addSubview(bannerViewAd)

        let request = GADRequest()
        #if DEBUG
            request.testDevices = [kGADSimulatorID]
        #endif
        bannerViewAd.load(request)
    }


}

// MARK: - GADBannerViewDelegate
extension SwiftyAd: GADBannerViewDelegate {

    // Did receive
    func adViewDidReceiveAd(_ bannerView: GADBannerView) {
        print("AdMob banner did receive ad from: \(bannerView.adNetworkClassName ?? "")")

        bannerView.isHidden = false
        UIView.animate(withDuration: 1.5) { [weak self] in
            self?.setBannerToOnScreenPosition(bannerView, from: bannerView.rootViewController)
        }
    }

    // Will present
    func adViewWillPresentScreen(_ bannerView: GADBannerView) { // gets called only in release mode
        print("AdMob banner clicked")
        delegate?.swiftyAdDidOpen(self)
    }

    // Will dismiss
    func adViewWillDismissScreen(_ bannerView: GADBannerView) {
        print("AdMob banner about to be closed")
    }

    // Did dismiss
    func adViewDidDismissScreen(_ bannerView: GADBannerView) { // gets called in only release mode
        print("AdMob banner closed")
        delegate?.swiftyAdDidClose(self)
    }

    // Will leave application
    func adViewWillLeaveApplication(_ bannerView: GADBannerView) {
        print("AdMob banner will leave application")
        delegate?.swiftyAdDidOpen(self)
    }

    // Did fail to receive
    func adView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: GADRequestError) {
        print(error.localizedDescription)

        UIView.animate(withDuration: 1.5 , animations: { [weak self] in
            self?.setBannerToOffScreenPosition(bannerView, from: bannerView.rootViewController)
            }, completion: { finish in
                bannerView.isHidden = true
        })
    }
}


// MARK: - Banner Positions
private extension SwiftyAd {

    func setBannerToOnScreenPosition(_ bannerAd: GADBannerView, from viewController: UIViewController?) {
        guard let viewController = viewController else { return }

        switch self.bannerPosition {
        case .bottom:
            bannerAd.center = CGPoint(x: viewController.view.frame.midX, y: viewController.view.frame.maxY - (bannerAd.frame.height / 2))
        case .top:
            bannerAd.center = CGPoint(x: viewController.view.frame.midX, y: viewController.view.frame.minY + (bannerAd.frame.height / 2))
        }
    }

    func setBannerToOffScreenPosition(_ bannerAd: GADBannerView, from viewController: UIViewController?) {
        guard let viewController = viewController else { return }

        switch self.bannerPosition {
        case .bottom:
            bannerAd.center = CGPoint(x: viewController.view.frame.midX, y: viewController.view.frame.maxY + (bannerAd.frame.height / 2))
        case .top:
            bannerAd.center = CGPoint(x: viewController.view.frame.midX, y: viewController.view.frame.minY - (bannerAd.frame.height / 2))
        }
    }
}

// MARK: - Alert
private extension SwiftyAd {

    func showNoVideoAvailableAlert(from viewController: UIViewController) {
        let alertController = UIAlertController(title: LocalizedString.sorry, message: LocalizedString.noVideo, preferredStyle: .alert)

        let okAction = UIAlertAction(title: LocalizedString.ok, style: .cancel)
        alertController.addAction(okAction)

        /*
         `Ad` event handlers may be called on a background queue. Ensure
         this alert is presented on the main queue.
         */
        DispatchQueue.main.async {
            viewController.present(alertController, animated: true)
        }
    }
}

// MARK: - Print
private extension SwiftyAd {

    /// Overrides the default print method so it print statements only show when in DEBUG mode
    func print(_ items: Any...) {
        #if DEBUG
            Swift.print(items)
        #endif
    }
}

关于单独 Controller 中的 iOS admob 横幅 - testDevices id 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46022093/

相关文章:

ios - iOS应用程序的自定义年龄限制?

ios - 如何从嵌入在父 View Controller 的 subview Controller 中的 UISearchViewController 中呈现 View Controller ?

google-play - Unity无法将类转换为dex格式

iphone - Xcode 中 Subversion 的配置

php - AFNetworking 将 UIImage 上传为 NSData -> PHP 脚本移动文件

swift - Swift 本地化

android - 有没有办法通过 AdMob 只转换自家广告?

ios - 隐藏广告横幅导致不再请求/显示广告

ios - 从 OpenGL 移植到 MetalKit - 投影矩阵(?)问题

ios - 在调用其他函数之前更新 UIView?