2016-05-26 4 views
0

Это довольно долго, но это, вероятно, очень простое решение. Большинство это код, просто перейдите к нижней и там будет Т.Л., д-рSwist Admob Interstitial Error

Эй, так что я следовал около 10 учебных пособий на получение AdMob межстраничную работать в моей игре Swift Spritekit. Кроме всех обучающих программ, которые я видел, используйте кнопку IBAction с помощью кнопки. В настоящее время я хотел бы, чтобы объявления отображались каждый раз в меню. (только для начала, я могу изменить его позже). Все это работает отлично, но как только я нажал кнопку воспроизведения (перейдя на другую сцену), а затем вернусь к сцене меню. (GameScene) Интерстициальная функция больше не выполняется. Нет ошибки, она просто не делает этого больше, пока приложение не будет полностью закрыто и повторно открыто.

Вот код.

В моем классе GameViewController у меня есть:

var interstital: GADInterstitial! 

И в сделал нагрузки 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) 

Кроме того, в классе GameViewController у меня есть эти функции:

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 

} 

В моем классе 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") 

} 

Итак, я вызываю функцию ShowAd (которая находится в gameviewcontroller) в моем GameScene каждые 20 секунд, (я подтвердил, что по крайней мере, думает, что это вызов функции.) Он отлично работает, когда приложение открывается для начала. Но когда я меняю сцену, а затем возвращаюсь к сцене меню (GameScene), функция Prints in my GameScene продолжает происходить, и мой код считает, что он вызывает функцию ShowAd, но кажется, что ничего не происходит, даже не отпечатки, которые находятся в функции ShowAd в GameViewController.

Так кажется, что после смены сцен и возврата, моя игра забывает, что такое GameViewController. Если я обращаюсь к GameViewController без «?» это приведет к краху моей игры с ошибкой «неожиданно обнаружено нуль при распаковке опционального». Итак, после смены сцен, возможно, GameViewController становится нулевым? Как я могу это исправить.

Пожалуйста, помогите мне !!! (Я новичок в программировании на случай, если вы не можете сказать. Я знаю, что должно быть заманчиво сделать комментарий от моего кода, это действительно голые кости, и на данный момент это не так хорошо.)

Спасибо так много, если вы можете мне помочь, и вау .. спасибо за чтение всего этого.;)

ответ

1

Вы, скорее всего, проблема в том, что как только вы перейдете на новую сцену, свойство viewController установлено на nil, следовательно, сбой, если вы использование!.

В целом, это не самая лучшая практика для ссылки на viewController в вашем SKScenes, вы должны использовать Центр делегирования или NSNotification Center.

1) Центр уведомлений (самый простой способ)

В вашем ViewController, где у вас есть функция, чтобы показать объявления добавить наблюдатель NSNotificationCenter в ViewDidLoad

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

(селектор функция для вызова и имя ключ для ссылки на этот наблюдатель)

чем в вашем SKScenes, когда вы хотите показать объявление вы просто опубликовать уведомление

NSNotificationCenter.defaultCenter().postNotificationName("ShowInterAdKey", object: nil) 

2) Для примеров делегирования ознакомьтесь с этими статьями.

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

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

3) Я также заметил, что вы не поджимать объявления, прежде чем показать им, что не является очень эффективным и может вызвать задержки показа объявлений.

Вы должны позвонить

interstital = CreateAd() 

в viewDidLoad так загрузит первое объявление как можно скорее. Чем вы должны использовать метод делегата AdMob

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

немедленно загрузить следующее объявление, как только ток один закрыт.

Для использования делегатов вы можете создать расширение в 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) 
    } 
} 

Чтобы убедиться, что они дозвонились идти к вашей функции createAd и добавить эту строку перед возвращением объявления

let interstitial = ... 
interstitial.delegate = self 

Наконец ваш 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) Вы также можете che ck из моего помощника на gitHub, если вы ищете более многоразовое решение.

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

В общем наконечнике вы также должны следовать быстрые соглашения о присвоении имен, ваша FUNC и свойства должны начинаться с маленькой буквы. Только классы, структуры, перечисления и протоколы должны начинаться с заглавных букв. Это делает ваш код труднее читать для себя и для stackoverflow, потому что он отмечен синим, но не должен. Иногда вы делаете, а иногда нет.

Надеется, что это помогает

+0

Спасибо за тщательный и ранний отзыв! Я сразу же займусь этим и позволю (и кому-нибудь еще) знать, как это происходит! –

+0

Прохладный, также проверяйте комментарий Daniel Storm, вы также загружаете его неправильно. Сначала создайте объявление, а затем создайте его. – crashoverride777

+0

Вы также должны обновить свой код для вызова метода createAd ранее. На данный момент вы загружаете новую рекламу, которую вы хотите показать. Вы должны предварительно загрузить его за кулисы, чтобы они были готовы, как только захотите. – crashoverride777

1

Я бы поставил это ваш вопрос:

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

Вы представляете свой интерстициальные, а затем сразу же переписав interstitial. Вы должны реализовать методы делегирования GADInterstitial и вызвать свой func CreateAd() -> GADInterstitial, как только вызывается func interstitialDidDismissScreen(ad: GADInterstitial!).

+0

Его главной проблемой является ссылка на viewController. Как только первая сцена будет удалена от свойства, будет нуль. Вы комментируете правду, также – crashoverride777

Смежные вопросы