5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AdMobのインタースティシャルについて [ios]

Last updated at Posted at 2015-04-21

#解決!
私の方での問題だったようです・・・。
それを直したところ、このやり方でも動くようになりました!
教えてくださり、ありがとうございました。
こういうやり方もあるという形で記事を残しておきたいと思います。

#公式通りにやってみる

- (GADInterstitial *)createAndLoadInterstitial {
    GADInterstitial *interstitial = [ [GADInterstitial alloc] init ];
    interstitial.adUnitID = @"テスト用IP";
    interstitial.delegate= self;
    [interstitial loadRequest:[GADRequest request]];
    return interstitial;
}

- (void)interstitialDidDismissScreen:(GADInterstitial *)interstitial {
    self.adMobInterstitial = [self createAndLoadInterstitial];
}

インタースティシャルを何度も表示する場合、公式にはこのような処理が書いています。
実際にやってみると、1回目のインタースティシャルは全く問題なく表示!
しかし、シーンを切り替え、もう1度表示してみると・・・。
ロードが長く動かない!そしてアプリが落ちる!私の環境だけかも・・・?

#調べてみる
ロードが長く動かないならば、ロードが完了していないのだな、と思い
公式に書いてあるインタースティシャルのライフサイクルのイベントを使って調べてみる。

- (void)interstitialDidDismissScreen:(GADInterstitial *)interstitial {
    self.adMobInterstitial = [self createAndLoadInterstitial];
    NSLog("再度、生成!");
}

loadRequest: が成功し、インタースティシャルを表示するための isReady が適切なタイミングで有効な場合に送信
- (void)interstitialDidReceiveAd:(GADInterstitial *)interstitial {
    Log::log("ロード完了!");
}

interstitial がユーザーに表示される直前に送信
- (void)interstitialWillPresentScreen:(GADInterstitial *)interstitial {
    Log::log("表示開始!");
}

// loadRequest: が失敗した場合に送信
- (void)interstitial:(GADInterstitial *)interstitial didFailToReceiveAdWithError:(GADRequestError *)error {
    Log::log("loadRequest 失敗");
}

こんな感じで分かる程度の適当さで作って、実験してみたところ・・・。

表示開始! 
(広告の×マークを押し、消す)
再度、生成!
ロード完了!

あれ、次のインタースティシャル表示のためのロード終わってる?
じゃあ何故・・・。

#試行錯誤してみる
もう1度公式サイトを見直してみよう!という事で見直す。
探していると、ライフサイクルイベントの中で怪しいものを発見!

 (void)interstitialWillDismissScreen:(GADInterstitial *)interstitial
interstitial が画面から消え、アプリとルート ビュー コントローラ(スプラッシュ以外の場合)が復元される直前に送信されます。この時点で、interstitialWillPresentScreen: で一時停止していたフォアグラウンド処理を再開する必要があります。

おや、これは・・・?
こちらで再生成してみたらどうなるのだろう?という疑問が生じたので早速実装。

- (void)interstitialWillDismissScreen:(GADInterstitial *)interstitial {
	self.adMobInterstitial = [self createAndLoadInterstitial];
    NSLog("再度、生成!");
}

これで実行してみたところ・・・。

表示開始! 
(広告の×マークを押し、消す)
再度、生成!
ロード完了!

先程と同じ、そしてシーンを切り替えもう、1度表示してみると。
かわらない!

#試行錯誤してみる2
うーん、じゃあなんだろう・・・と悩んでいても始まらないと思い、試してみる事に。
最初はnilで初期化、表示したい場所でインタースティシャルを生成、
インタースティシャルが消されたらnilにする、というサイクルで実装。

- (void)viewDidLoad { 
	self.adMobInterstitial = nil;
}

// loadRequest: が成功し、インタースティシャルを表示するための isReady が適切なタイミングで有効な場合に送信されます。
- (void)interstitialDidReceiveAd:(GADInterstitial *)interstitial {
    [self.adMobInterstitial presentFromRootViewController:self];
    Log::log("ロード完了!");
}

- (void)interstitialDidDismissScreen:(GADInterstitial *)interstitial {
	self.adMobInterstitial = nil;
}

ロードが完了したらその時にもう表示してしまうという形にしてみた。すると・・・。
ロードが長くなく、すぐに動いた!

#結論
公式サイトに書いてるコードでも普通に動くと思いますが、
使うときにロードをした方が安定しているという結果になりました!(当たり前ですよね・・・)
メモリを沢山使っている状態でも動いた後者のがいいかもしれませんね・・・。
同じ症状で悩んでいる方がいれば、と思います。

5
4
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?