2017-01-31 2 views
0

J'ai intégré une vue de bannière dans une scène de mon application, mais je n'arrive pas à intégrer une annonce interstitielle dans une autre scène. Voici mon code: importation SpriteKit importation GameKit GoogleMobileAds importationPrésentation d'une annonce interstitielle dans un jeu sur une scène liée à GameViewController?

class GameOverMenu: SKScene, GKGameCenterControllerDelegate, UIAlertViewDelegate { 

var viewController: GameViewController! 
var interstitial: GADInterstitial! 

var myTimer = Timer() 


override func didMove(to view: SKView) { 

createAndLoadInterstitial() 

startMyTimer() 




} 


func createAndLoadInterstitial() { 
interstitial = GADInterstitial(adUnitID: "...") 
let request = GADRequest() 
request.testDevices = [ kGADSimulatorID, "..." ] 
interstitial.load(request) 
} 


func startMyTimer() { 
myTimer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(GameOverMenu.myFunction), userInfo: nil, repeats: false) 

} 

func myFunction(){ 

if interstitial.isReady { 
    interstitial.present(fromRootViewController: viewController) 
} else { 
    print("Ad wasn't ready") 
} 

} 

Il échoue quand il essaie de charger avec « erreur fatale: de façon inattendue trouvée nulle en déballant une valeur en option ». Le problème se situe ci-dessous comme si le code est affiché comme ça et je charge la scène GameOver lorsque l'application se lance, ça fonctionne très bien. Comment puis-je réparer cela?

if let view = self.view as! SKView? { 




    // Load the SKScene from 'MainMenu.sks' 
    if let scene = MainMenuScene(fileNamed: "MainMenu") { 

     scene.viewController = self 

     // Set the scale mode to scale to fit the window 
     scene.scaleMode = .aspectFill 

     // Present the scene 
     view.presentScene(scene) 


    } 

    if let scene3 = GameOverMenu(fileNamed: "GameOver") { 

     scene3.viewController = self 

     // Set the scale mode to scale to fit the window 
     scene3.scaleMode = .aspectFill 

     view.presentScene(scene3) 





    } 

Répondre

0

Le problème est que lorsque vous la transition entre 2 scènes que vous perdez la référence à GameViewController par exemple

scene3.viewController = self 

c'est pourquoi il ne fonctionne que lorsque vous lancez l'application.

Vous utilisez également! sur ces propriétés

var viewController: GameViewController! 
var interstitial: GADInterstitial! 

si elles sont nuls, vous allez planter. Donc, vous devriez toujours utiliser? quand vous n'êtes pas sûr à 100% que quelque chose est là.

var viewController: GameViewController? 
var interstitial: GADInterstitial? 

et que dans votre code tel que "myFunction" vous utiliserez le "?" et "if let" ne pas planter lorsque les propriétés sont nulles.

if let ad = interstitial, let vc = viewController, ad.isReady { 
     ad.present(fromRootViewController: vc) 
    } else { 
     print("Ad wasn't ready") 
    } 

Le correctif général pour votre problème est que vous devez déplacer vraiment tout votre code AdMob directement dans GameViewController. Que vous pouvez utiliser quelque chose comme NotificationCenter ou délégation pour transférer un message de vos scènes à votre ViewController pour montrer l'annonce. Ce n'est pas vraiment la meilleure pratique pour référencer votre ViewController dans vos SKScenes.

déplacer donc tout le code d'annonce à votre ViewController et que dans GameViewController en dehors de la mise en œuvre de classe créer cette extension pour la notification clé

extension Notification.Name { 
     static let showAd = Notification.Name(rawValue: "NotificationShowAd") 
} 

    class GameViewController: UIViewController {... 

Que dans GameViewController en viewDidLoad vous pouvez ajouter l'observateur

override func viewDidLoad() { 
    super.viewDidLoad() 

     createAndLoadInterstitial() 

     NotificationCenter.default.addObserver(self, selector: #selector(myFunction), name: .showAd, object: nil) 

     .... 
} 

maintenant, chaque fois que vous devez montrer une annonce de l'un de vos SKScenes vous pouvez appeler cette

NotificationCenter.default.post(name: .showAd, object: nil) 

Pour vous rendre la vie encore plus facile jeter un oeil à mon aide sur GitHub

https://github.com/crashoverride777/SwiftyAds

espérons que cette aide