2017-09-03 2 views
1

Ich habe eine Smart-Banner-Anzeige in einem View-Controller in meinem Swift iOS-Projekt implementiert, die perfekt zu funktionieren scheint. Der Code ist wie folgt:iOS admob Banner in separaten Controllern - testDevices id Best Practices?

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) 

Ich möchte jetzt das gleiche in einem anderen der View-Controller in meinem Projekt tun. Die einfachste Lösung wäre, den obigen Code einfach in den neuen Controller zu kopieren, was gut funktionieren würde.

Ich würde das lieber nicht tun, da mehrere Kopien der Test-ID-Zeichenfolge meines iPhone "my-iphone-device-id" scheint es ist nicht Best Practices. Gibt es eine bessere Möglichkeit, diese ID zu speichern, sodass alle Controller in meinem Projekt darauf zugreifen können, ohne dass ich die Zeichenfolge überall kopieren muss?

Antwort

1

Verwenden Sie diese Klasse für Centralizing AdBanner während der gesamten Anwendung.

So verwenden

// 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) 
    } 

Klasse

// 
// 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 
    } 
}