2016-05-26 2 views
0

これはかなり長いですが、おそらく本当に簡単な修正です。 DRSwift Admobインタースティシャルエラー

ねえ、私は私のスウィフトSpriteKitベースのゲームで動作するようにAdmobの格子間を得る上で、約10のチュートリアルに従ってきた、この最も は、ちょうど下にスキップし、TLがあるだろう、コードです。私が見たすべてのチュートリアルを除いて、ボタン付きのIBActionを使用します。 現在のところ、メニューの中に広告が表示されることがあります。 (ちょうど始めて、私は後でそれを変更するかもしれない)。 これは完全に機能しますが、一度再生ボタンを押すと(別のシーンに)、メニューシーンに戻ります。 (GameScene)インタースティシャル機能はもはや発生しません。エラーはありません。アプリが完全に閉じられてから再開されるまではそれ以上は機能しません。

ここにコードがあります。

var interstital: GADInterstitial! 

そして、私が持っているGameViewControllerいた負荷に:

GameViewControllerクラスでも
if let scene = GameScene(fileNamed:"GameScene") { 
     let skView = self.view as? SKView 
     skView!.ignoresSiblingOrder = false 
     scene.scaleMode = .AspectFill 

     scene.viewController = self 
     skView!.presentScene(scene) 

     interstital = GADInterstitial(adUnitID: "ca-app-pub-9776687746813194/9687097060") 

     let request = GADRequest() 
     interstital.loadRequest(request) 

私は、これらの機能を持っている:

func ShowAd() { 
    print("doing the showadfunc now") 

    if (interstital.isReady) { 

     print("there is an inter ready") 

     interstital.presentFromRootViewController(self) 
     interstital = CreateAd() 

    } 
    else{ 
     print("The interstitial wasn't ready.") 
    } 
} 

func CreateAd() -> GADInterstitial { 

    let interstital = GADInterstitial(adUnitID: "ca-app-pub-9776687748683194/9687247060") 
    interstital.loadRequest(GADRequest()) 
    return interstital 

} 
私が持っている私のGameViewControllerクラスで

私のGameScene(メニュー)クラスでは、私は持っています:

var viewController: GameViewController! 

私のGameSceneのクラスでは、インタースティシャル広告を表示するこの機能があります。だから、

func adThing(){ 
    //viewController?.ShowAd() 

    print("starting the ad function") 
    let waitForInterstitial = SKAction.waitForDuration(15.0) 
    let waitForInterstitialShort = SKAction.waitForDuration(3.0) 
    let showInterstitialAd = SKAction.runBlock({self.viewController?.ShowAd(); print("the function has been called..")}) 
    let waitThenShowInterstitial = SKAction.sequence([showInterstitialAd,waitForInterstitial]) 
    let waitThenShowInterStitialForever = SKAction.repeatActionForever(waitThenShowInterstitial) 
    //self.runAction(waitThenShowInterStitialForever) 
    self.runAction(waitForInterstitialShort, completion: { 
     print("its waited 3 seconds and will now start the ad thingo") 
     self.runAction(waitThenShowInterStitialForever) 
    }) 
    print("done") 

} 

、私は(私はそれが、少なくともそれが関数を呼び出していると考えて確認している)、20秒ごとに私のGameSceneに(gameviewcontrollerに位置しています)ShowAd関数を呼び出すとき、それは完璧に動作アプリは最初に開かれています。しかし、場面を変えてメニューシーン(GameScene)に戻ると、GameScene関数のPrints関数が継続していて、コードはShowAd関数を呼び出していると思いますが、何も起こっていないようです。 GameViewControllerのShowAd機能に含まれているプリントさえありません。

シーンを変更して戻った後のように、私のゲームはGameViewControllerのことを忘れてしまったようです。私が '?'を付けずにGameViewControllerを参照すると、それはエラーで私のゲームをクラッシュさせる "予期せず、オプションのラップを解除している間に無かった"ですから、シーンを変更した後は、おそらくGameViewControllerがnilになりますか?どうしたらいいですか?

私を助けてください! (私はプログラミングに慣れていないので、私のコードについて卑猥なコメントをするのは魅力的でなければならないことを知っています。それは現時点では裸の骨であり、あまり良いことではありません)。

ありがとうあなたが私を助けることができれば、あなたが助けてくれるなら、私は助けてくれるでしょう)。

答えて

1

あなたが問題になる可能性が高いのは、新しいシーンに移行すると、viewControllerプロパティはnilに設定されます。つかいます !。

SKScenesでviewControllerを参照するのがベストプラクティスではないので、委任またはNSNotification Centerを使用する必要があります。あなたが広告を表示する機能を持っているあなたのViewControllerで

1)通知センター(最も簡単な方法)

は(セレクタが関数呼び出しと名前にあるのviewDidLoad

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(showAd), name: "ShowInterAdKey", object: nil) 

にNSNotificationCenterオブザーバを追加しますあなたのSKScenesよりも、このオブザーバを参照するためのキー)

あなたが単に通知

を投稿広告を表示したいです

2)代表団の例については、これらの記事をチェックしてください。

http://stephenradford.me/creating-a-delegate-in-swift/

https://www.natashatherobot.com/ios-weak-delegates-swift/

3)私はまた、非常に効率的ではなく、広告を表示遅延を引き起こす可能性があり、あなたがそれらを表示する前に広告をプリロードされていないことに気づきました。

それはできるだけ早く最初の広告をロードするようにするには、のviewDidLoadで

interstital = CreateAd() 

を呼び出す必要があります。 adMobデリゲートメソッド

func interstitialDidDismissScreen(ad: GADInterstitial!) { 
    // load next ad 
    interstital = CreateAd() 

を使用すると、現在の広告が閉じられるとすぐに次の広告が読み込まれます。

あなたは必ずこれらがあなたのcreateAd機能に行くと呼ばれるプレゼントと広告最後に

let interstitial = ... 
interstitial.delegate = self 

あなたを返す前に、この行を追加するのViewController

extension MyViewController: GADInterstitialDelegate { 

func interstitialDidReceiveAd(ad: GADInterstitial!) { 
    print("AdMob interstitial did receive ad from: \(ad.adNetworkClassName)") 
} 

func interstitialWillPresentScreen(ad: GADInterstitial!) { 
    print("AdMob interstitial will present") 
    // pause game/app 
} 

func interstitialWillDismissScreen(ad: GADInterstitial!) { 
    print("AdMob interstitial about to be closed") 
} 

func interstitialDidDismissScreen(ad: GADInterstitial!) { 
    print("AdMob interstitial closed, reloading...") 
    interstitial = createAd() 
} 

func interstitialWillLeaveApplication(ad: GADInterstitial!) { 
    print("AdMob interstitial will leave application") 
    // pause game/app 
} 

func interstitialDidFailToPresentScreen(ad: GADInterstitial!) { 
    print("AdMob interstitial did fail to present") 
} 

func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) { 
    print(error.localizedDescription) 
    } 
} 

で拡張を作成することができますデリゲートを使用するにはshowAdメソッドは次のようになります

func showAd() { 
    print("doing the showadfunc now") 

    if (interstital.isReady) { 
     print("there is an inter ready") 
     interstital.presentFromRootViewController(self) 
    } else{ 
     print("The interstitial wasn't ready, reloading again.") 
     interstital = CreateAd() 

    } 
} 

4)もしあなたがより再利用可能な解決策を探しているなら、gitHubで私のヘルパーをckしてください。

https://github.com/crashoverride777/Swift-AdMob-AppLovinTVOS-CustomAds-Helpers

一般的なヒントとして、あなたはまた、迅速な命名規則に従ってください、あなたのFUNCとプロパティは、小さな文字で開始する必要があります。クラス、構造体、列挙型、プロトコルのみ大文字で始める必要があります。 これは、青色でマークされているため、自分自身とスタックオーバーフローで読みにくいコードにします。あなたはしばしばやっていることがあります。

if (interstital.isReady) { 
    print("there is an inter ready") 
    interstital.presentFromRootViewController(self) 
    interstital = CreateAd() 

あなたの間隙を提示し、その後すぐにinterstitialを上書きしている:

希望これは、私はこれがあなたの問題である賭ける思い

+0

徹底的で早期のフィードバック返信いただきありがとうございます!私はすぐにこれに取り組み、あなた(そして他の誰か)がそれがどのように進むのかを知らせるでしょう! –

+0

また、Daniel Stormのコメントもチェックしてください。間違って読み込んでいます。まず広告を作成し、それを提示します。 – crashoverride777

+0

また、以前にcreateAdを呼び出すようにコードを更新する必要があります。現時点では、新しい広告を残しておき、残っている広告を表示したいとします。彼らはあなたが望むようにすぐに準備ができるように、シーンの背後にあらかじめロードする必要があります。 – crashoverride777

1

に役立ちます。 GADInterstitialのデリゲートメソッドを実装し、が呼び出された後にfunc CreateAd() -> GADInterstitialを呼び出す必要があります。

+0

彼の主な問題は、viewControllerを参照していることです。最初のシーンがプロパティから離れると、ゼロになります。あなたはコメントも真実です – crashoverride777

関連する問題