2017-09-03 1 views
1

J'ai mis en place une bannière intelligente dans un contrôleur de vue dans mon projet Swift iOS, qui semble fonctionner parfaitement. Le code est le suivant:iOS admob banners dans des contrôleurs séparés - testDevices id pratiques d'excellence?

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) 

Je voudrais maintenant faire la même chose dans un autre des contrôleurs de vue dans mon projet. La solution la plus simple serait simplement de copier-coller le code ci-dessus dans le nouveau contrôleur, ce qui fonctionnerait bien.

Je préfère ne pas le faire, car avoir plusieurs copies de la chaîne d'identification test de mon iPhone "my-iphone-device-id" semble que ce ne sont pas les meilleures pratiques. Existe-t-il un meilleur moyen de stocker cet ID pour que tous les contrôleurs de mon projet puissent y accéder, sans que je doive copier-coller la chaîne partout?

Répondre

1

Utiliser cette classe pour Centralizing AdBanner pour toute l'application entière.

Comment utiliser

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

Classe

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